J'ai renvoyé le code pour trouver une factorielle et afficher les zéros à la fin de la factorielle, mais la sortie est fausse ... pourriez-vous s'il vous plaît m'aider à trouver l'erreur?
#include <stdio.h> int main() { int m = 1, i, N, count = 0; scanf("%d", &N); for (i = 1; i <= N; i++) { m = m * i; } printf("%d", m); while (m > 0) { if ((m % 10) == 0) { count = count + 1; m = m / 10; } break; } printf("%d", count); return 0; }
3 Réponses :
vous avez deux problèmes
Donc, les changements minimes produisent:
pi@raspberrypi:/tmp $ ./a.out 5 120 1 pi@raspberrypi:/tmp $ ./a.out 10 3628800 2
après les changements:
int main() { int m=1,i,N,count=0; scanf("%d",&N); for(i=1;i<=N;i++) { m=m*i; } printf("%d\n",m); /* <<< added \n */ while(m>0) { if((m%10)==0) { count=count+1; m=m/10; } else /* <<< added else */ break; } printf("%d\n",count); /* <<< added \n */ return 0; }
Bien sûr que suppose d'abord que vous soyez capable de calculer la factorielle sans débordement
Je vous encourage également à vérifier qu'une valeur a été lue par scanf , en vérifiant qu'elle renvoie 1
Votre code ne fonctionne que pour de très petites valeurs de N
: jusqu'à 9
. Pour des valeurs légèrement plus grandes, vous devrez ajouter un mot-clé else
avant l'instruction break
et vous obtiendrez un résultat correct dans quelques cas supplémentaires.
Pour des valeurs plus grandes , vous devez calculer la puissance de 5 qui divise la factorielle. Vous pouvez le faire de manière incrémentielle en additionnant la puissance de 5 qui divise chaque nombre individuel jusqu'à et y compris N
.
#include <stdio.h> int main() { int N, count; if (scanf("%d", &N) != 1) return 1; count = 0; for (int i = N; (i /= 5) > 0;) { count += i; } printf("%d\n", count); return 0; }
Une solution encore plus simple et plus rapide est-ce: calculer le nombre de multiples de 5
inférieur ou égal à N
, ajouter le nombre de multiples de 5 * 5
, etc.
Voici le code:
#include <stdio.h> int main() { int N, count; if (scanf("%d", &N) != 1) return 1; /* only consider factors that are multiples of 5 */ count = 0; for (int i = 5; i <= N; i += 5) { for (int j = i; j % 5 == 0; j /= 5) count++; } printf("%d\n", count); return 0; }
#include <stdio.h> int main() { int n,i,f=1,t,c=0; printf("Enter number "); scanf("%d",&n); t=n; for(i=1;t>=5;i++) { t=n/5; c=c+t; n=t; } printf("number of zeros are %d",c); return 0; }
Je vous suggère d'ajouter des détails sur la nature du problème avant de fournir une réponse. De cette façon, les gens peuvent apprendre et pas seulement avoir des solutions.
Ce n'est pas l'approche que la tâche adopte. Le naïf ne fonctionnera pas bien ici, vous devez penser à un algorithme non trivial. Quant à votre problème - vous êtes probablement simplement en train de déborder l'entier.
Ce serait formidable si vous pouviez également nous dire quelles contributions vous avez essayées et quels résultats vous avez obtenus. L'erreur pourrait avoir été causée par de nombreuses choses. Edit: Bien sûr, il existe des moyens plus simples de le faire en tant que @EugeneSh. déclaré. Pensez-y comme une multiplication. Qu'est-ce qui fait que votre résultat a un 0 à la fin?
Vous devriez penser à une autre logique, car je pense que l'approche n'est pas la bonne.
Pour ce faire sans déborder il vous suffit de compter chaque fois que vous multipliez par 5, par exemple en 25! vous multipliez par 5 deux fois pour le 25, une fois chacun pour 15, 10 et 5. Il y aura donc 5 zéros de fin (notez qu'il y a un surplus de multiples de 2, pour transformer les 5 en multiples de 10)
@JamesSnook Je ne suis pas convaincu que ce soit suffisant, car il semble qu'il puisse y avoir d'autres combinaisons de nombres ou sommes de combinaisons qui peuvent générer des zéros de fin supplémentaires, en particulier pour les plus grands nombres.
@AndrewHenle Vous pouvez seulement obtenir un multiple de dix en faisant 5 * 2 et les multiples de 10 sont le seul moyen d'obtenir des zéros de fin.