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:
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. fun(x)
?. Ne nommez jamais rien d’ fun()
c’est comme une science libre, à quoi ça sert? 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(); }