Advertisement
alsagone

factorion.c

Jan 15th, 2018
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.21 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define TRUE (1==1)
  6. #define FALSE (1==0)
  7.  
  8. /*  Factorion : nombre qui est égal à la somme des factorielles de ses chiffres
  9. *   Il en n'existe que 4 : 1, 2, 145 et 40 585.
  10. *   145 -> 1! + 4! + 5! = 1 + 24 + 120 = 145
  11. */
  12.  
  13. int factorielle (int n)
  14. {
  15.     if (n == 0)
  16.     {
  17.         return 1 ;
  18.     }
  19.  
  20.     else
  21.     {
  22.         return (n*factorielle(n-1)) ;
  23.     }
  24. }
  25.  
  26. int nombre_chiffres (int n)
  27. {
  28.     int compteur = 0 ;
  29.  
  30.     while (n != 0)
  31.     {
  32.         n /= 10 ;
  33.         compteur++ ;
  34.     }
  35.  
  36.     return compteur ;
  37. }
  38.  
  39.  
  40. // string_to_int : renvoie n sous forme d'une chaîne de caractères
  41. char* string_to_int (int n)
  42. {
  43.     int nb_chiffres = nombre_chiffres(n) ;
  44.     int i ;
  45.  
  46.     char* s = (char*) malloc ((nb_chiffres)*sizeof(char)) ;
  47.     s[nb_chiffres] = '\0' ;
  48.    
  49.     for (i = nb_chiffres-1 ; i >= 0 ; i--)
  50.     {
  51.         s[i] = (n % 10) + '0' ;
  52.         n /= 10 ;
  53.     }
  54.  
  55.     return s ;
  56. }
  57.  
  58. // char_to_int : renvoie le nombre associé à c
  59. int char_to_int (char c)
  60. {
  61.     int d = 0 ;
  62.  
  63.     switch (c)
  64.     {
  65.         case '0' : d = 0 ; break ;
  66.         case '1' : d = 1 ; break ;
  67.         case '2' : d = 2 ; break ;
  68.         case '3' : d = 3 ; break ;
  69.         case '4' : d = 4 ; break ;
  70.         case '5' : d = 5 ; break ;
  71.         case '6' : d = 6 ; break ;
  72.         case '7' : d = 7 ; break ;
  73.         case '8' : d = 8 ; break ;
  74.         case '9' : d = 9 ; break ;
  75.         default : break ;
  76.     }
  77.  
  78.     return d ;
  79. }
  80.  
  81. //est_un_factorion : vérifie si n est un factorion
  82. int est_un_factorion(int n)
  83. {
  84.     char* s = string_to_int(n) ;
  85.     int nb_chiffres = nombre_chiffres(n) ;
  86.  
  87.     int b = FALSE ;
  88.     int c, i ;
  89.  
  90.     unsigned int somme = 0 ;
  91.  
  92.     for (i = 0 ; i < nb_chiffres ; i++)
  93.     {
  94.         c = char_to_int(s[i]) ;
  95.         somme += factorielle(c) ;
  96.  
  97.         /*  On décompose n chiffre par chiffre
  98.         *   et pour chaque chiffre, somme = somme + factorielle(chiffre)
  99.         */
  100.     }
  101.  
  102.     if (somme == n)
  103.     {
  104.         b = TRUE ;
  105.     }
  106.  
  107.     return b ;
  108. }
  109.  
  110. void affichage_factorion(int n)
  111. {
  112.     if (est_un_factorion(n) == TRUE)
  113.     {
  114.         printf("%d est un factorion.\n",n);
  115.     }
  116.  
  117.     return ;
  118. }
  119.  
  120. int main (int argc, char** argv)
  121. {
  122.     int n ;
  123.  
  124.     if (argc == 2)
  125.     {
  126.         n = atoi(argv[1]) ;
  127.     }
  128.  
  129.     else
  130.     {
  131.         printf("Nombre : ") ;
  132.         scanf("%d",&n) ;
  133.     }
  134.  
  135.     int i ;
  136.  
  137.     for (i = 1 ; i <= n ; i++)
  138.     {
  139.         affichage_factorion(i) ;
  140.     }
  141.  
  142.     return 0 ;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement