Problème déterminant si un nombre est un nombre Armstrong

J’essaie de vérifier si le numéro fourni par l’utilisateur est un numéro armstrong . Quelque chose ne va pas cependant et je ne peux pas le comprendre.

Toute aide est appréciée.

Code attaché ci-dessous.

#include int fun(int); int main() { int x,a,b,y=0; printf("enter the number you want to identify is aN ARMSTRONG OR NOT:"); scanf("%d",&a); for(int i=1 ; i<=3 ; i++) { b = a % 10; x = fun(b); y = x+y; a = a/10; } if(y==a) printf("\narmstrong number"); else printf("\nnot an armstrong number"); return 0; } int fun(int x) { int a; a=x*x*x; return (a); } 

Le principal problème est que vous ne gardez pas une trace du nombre avec lequel vous commencez. Vous divisez a par 10 de manière répétée (il se termine par 0), puis vous comparez 0 à 153. Ils ne sont pas égaux.

Votre autre problème est que vous ne pouvez pas rechercher des nombres Armstrong à 4 chiffres ou plus, ni des numéros à 1 chiffre autres que 1. Votre fonction fun() serait mieux nommée cube() ; dans mon code ci-dessous, il est renommé power() car il est généralisé pour gérer les nombres à N chiffres.


J’ai décidé que pour la gamme de puissances considérée, il n’était pas nécessaire d’utiliser un algorithme plus complexe pour power() – un algorithme qui divise par deux, etc. Il y aurait une économie sur les nombres de 6 à 10 chiffres, mais vous ne pourriez pas. t pas le mesurer dans ce contexte. Si compilé avec -DDEBUG , cela inclut l’impression de diagnostic – qui a été utilisée pour me rassurer que mon code fonctionnait correctement. Notez également que la réponse fait écho à l’entrée; Il s’agit d’une technique de base permettant de s’assurer que vous obtenez le bon comportement. Et j’ai encapsulé le code dans une fonction pour tester si un nombre est un nombre Armstrong, appelé itérativement depuis le programme principal. Cela facilite les tests. J’ai ajouté des contrôles à scanf() pour éviter les problèmes, une autre technique de programmation de base importante.

J’ai vérifié la plupart des numéros Armstrong jusqu’à 146511208 et cela semble correct. Les couples 370 et 371 insortingguent.

 #include  #include  #ifndef DEBUG #define DEBUG 0 #endif static int power(int x, int n) { int r = 1; int c = n; while (c-- > 0) r *= x; if (DEBUG) printf(" %d**%d = %d\n", x, n, r); return r; } static bool isArmstrongNumber(int n) { int y = 0; int a = n; int p; for (p = 0; a != 0; a /= 10, p++) ; if (DEBUG) printf(" n = %d, p = %d\n", n, p); a = n; for (int i = 0; i < p; i++) { y += power(a % 10, p); a /= 10; } return(y == n); } int main(void) { while (1) { int a; printf("Enter the number you want to identify as an Armstrong number or not: "); if (scanf("%d", &a) != 1 || a <= 0) break; else if (isArmstrongNumber(a)) printf("%d is an Armstrong number\n", a); else printf("%d is not an Armstrong number\n", a); } return 0; } 

Un problème peut être que vous changez a (donc il n’aura plus la valeur d’origine). En outre, il ne correspondrait que 1, 153, 370, 371, 407 . C’est une astuce pour remplacer le for et tester jusqu’à ce a soit égal à zéro et pour changer la fonction à augmenter en nombre de chiffres.

 #include #include  int power(int, int); int numberofdigits(int); //Routine to test if input is an armstrong number. //See: http://en.wikipedia.org/wiki/Narcissistic_number if you don't know //what that is. int main() { int input; int digit; int sumofdigits = 0; printf("enter the number you want to identify as an Armstrong or not:"); scanf("%d",&input); int candidate = input; int digitcount = numberofdigits(input); for(int i=1 ; i <= digitcount ; i++) { digit = candidate % 10; sumofdigits = sumofdigits + power(digit, digitcount); candidate = candidate / 10; } if(sumofdigits == input) printf("\n %d is an Armstrong number", input); else printf("\n %d is NOT an Armstrong number", input); return 0; } int numberofdigits(int n); { return log10(n) + 1; } int power(int n, int pow) { int result = n; int i=1; while (i < pow) { result = result * n; i++; } } 

Quel était le problème avec le code:

  1. Pas d'utilisation de noms de variables significatifs , rendant la signification du code difficile à comprendre; rappelez-vous que le code est écrit pour les humains, pas pour les compilateurs.
  2. N'utilisez pas de code déroutant ce code: int x,a,b,y=0; est déroutant, tous les vars se mettent-ils à 0 ou juste à y . Toujours mettre les vars qui sont initialisés sur une ligne séparée. Cela facilite la lecture. Faites un effort supplémentaire pour être sans ambiguïté, cela rapportera beaucoup de temps à long terme.
  3. Utilisez des commentaires: si vous ne savez pas ce qu'est un numéro armstrong, il sera très difficile de le distinguer de votre code. Mettez quelques commentaires significatifs afin que les gens sachent ce que votre code est censé faire. Cela facilitera les choses pour vous et les autres, car ils savent ce que vous voulez faire et peuvent voir ce que vous avez réellement fait et résoudre la différence si besoin est.
  4. utiliser des noms de routine significatifs que WTF fait-il avec fun(x) ?. Ne nommez jamais rien d’ fun() c’est comme une science libre, à quoi ça sert?
  5. Ne codez pas les choses en dur , votre routine accepte uniquement les nombres armstrong3, mais si vous pouvez coder en dur, pourquoi ne pas return (input == 153) || (input == 370) || .... return (input == 153) || (input == 370) || ....
 /* Name: Rakesh Kusuma Email Id: [email protected] Title: Program to Display List of Armstrong Numbers in 'C' Language */ #include #include int main() { int temp,rem, val,max,temp1,count; int num; val=0; num=1; printf("What is the maximum limit of Armstrong Number Required: "); scanf("%d",&max); printf("\nSo the list of Armstrong Numbers Before the number %d are: \n",max); while(num <=max) { count = 0; temp1 = num; while(temp1!=0) { temp1=temp1/10; count++; } if(count<3) count = 3; temp = num; val = 0; while(temp>0) { rem = temp%10; val = val+pow(rem,count); temp = temp/10; } if(val==num) { printf("\n%d", num); } num++; } return 0; } 

Le numéro de chèque est Armstrong ou n’utilise pas le langage C

 #include #include void main() { A: int n,n1,rem,ans; clrscr(); printf("\nEnter No. :: "); scanf("%d",&n); n1=n; ans=0; while(n>0) { rem=n%10; ans=ans+(rem*rem*rem); n=n/10; } if(n1==ans) { printf("\n Your Entered No. is Armstrong..."); } else { printf("\n Your Entered No. is not Armstrong..."); } printf("\n\nPress 0 to Continue..."); if(getch()=='0') { goto A; } printf("\n\n\tThank You..."); getch(); }