fork download
  1. /* ==============================================================
  2.  * Από: migf1
  3.  *
  4.  * Άθροισμα Παραγοντικών
  5.  * ---------------------
  6.  * Δίνεται ένας ακέραιος τυχαίος αριθμός. Βρείτε το άθροισμα των παραγοντικών που
  7.  * προκύπτουν από καθένα από τα ψηφία του. Επαναλάβατε τη διαδικασία με τα ψηφία
  8.  * του αριθμού που προέκυψε σαν άθροισμα. Η επαναληπτική διαδικασία ολοκληρώνεται
  9.  * όταν ένας από τους αριθμούς που προκύπτουν από αυτή τη διαδικασία σαν άθροισμα
  10.  * έχει ήδη παραχθεί σε προηγούμενο βήμα.
  11.  *
  12.  * Περισσότερα: http://w...content-available-to-author-only...s.gr/index.php/exercises/86-2011-07-29-05-46-33
  13.  * ==============================================================
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18.  
  19. #define MAX_OUTNUM 9999999+1 // μέγιστο μήκος χάρτη
  20. #define OUTBOUND(x) ( (x) < 0 || (x) > 9999999 ) // συνθήκη άκυρης εισόδου
  21.  
  22. typedef struct { // δομή χάρτη
  23. int found; // boolean
  24. unsigned int istep; // τιμή μετρητή
  25. }MapElem;
  26.  
  27. // ---------------------------------------------------------------------------------
  28. // Συνάρτηση fact:
  29. // επιστρέφει το παραγοντικό του n (λειτουργεί με αναδρομή)
  30. //
  31. long int fact(long int n)
  32. {
  33. return n < 2 ? 1 : n * fact(n-1);
  34. }
  35. // ---------------------------------------------------------------------------------
  36. // Συνάρτηση factsum:
  37. // επιστρέφει το άθροισμα των παραγοντικών των ψηφίων του n
  38. //
  39. long int factsum( long int n )
  40. {
  41. long int fsum = 0;
  42. do {
  43. fsum += fact(n % 10);
  44. n /= 10;
  45. } while( n );
  46.  
  47. return fsum;
  48. }
  49.  
  50. // ---------------------------------------------------------------------------------
  51. int main ( void )
  52. {
  53. long int fsum; unsigned int i=0; // αποτέλεσμα και μετρητής
  54. MapElem *map=calloc(MAX_OUTNUM,sizeof(MapElem));// δέσμευση μνήμης για χάρτη
  55. // (στη heap, για πιο σίγουρα)
  56.  
  57. if ( !map ) { // αποτυχία δέσμευσης μνήμης
  58. puts("*** error: out of memory, aborting program...");
  59. exit( EXIT_FAILURE ); // πρόωρος τερματισμός
  60. }
  61.  
  62. do { // απαίτηση έγκυρης εισόδου
  63. printf("Δώστε έναν αριθμό μεταξύ 0 και 9999999: ");
  64. scanf("%ld", &fsum);
  65. } while( OUTBOUND(fsum) );
  66.  
  67. do { // το κεντρικό μας loop
  68. printf("%ld, ", fsum); // τύπωμα αποτελέσματος
  69. (map+fsum)->found = 1; // χαρτογράφηση αποτελέσματος
  70. (map+fsum)->istep = i++; // αποθήκευση βήματος του loop
  71. } while( !(map + (fsum = factsum(fsum)))->found );
  72.  
  73. printf("%ld\n\n", fsum); // τελευταίο αποτέλεσμα
  74. printf("Μήκος λίστας παραγοντικών: %u\n", i+1);
  75. printf("Η λίστα παρουσίασε τον ίδιο αριθμό στην θέση: %d\n", (map+fsum)->istep+1);
  76. putchar('\n');
  77.  
  78. free( map ); // αποδέσμευση μνήμης χάρτη
  79.  
  80. exit( EXIT_SUCCESS ); // επιτυχής τερματισμός
  81. }
  82.  
stdin
25
compilation info
prog.c: In function ‘main’:
prog.c:64: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result
stdout
Δώστε έναν αριθμό μεταξύ 0 και 9999999: 25, 122, 5, 120, 4, 24, 26, 722, 5044, 169, 363601, 1454, 169

Μήκος λίστας παραγοντικών: 13
Η λίστα παρουσίασε τον ίδιο αριθμό στην θέση: 10