Je veux créer un programme pour trouver la somme des factorielles de tous les nombres d'une série jusqu'à 20. Je dois trouver 's' dans s = 1 + (1 * 2) + (1 * 2 * 3) + ... (1 * 2 * 3 ... 20). J'ai essayé un programme mais il ne fonctionne pas. J'utilise BlueJ IDE.
int a =1; int s = 0; for(int i = 1; i <= 10; i++) { while (i >0) { a = a * i; i--; } s = s+a; } System.out.println(s);
Le compilateur n'affiche aucun message d'erreur mais lorsque j'exécute le programme, la JVM (Java Virtual Machine) continue de se charger et l'écran de sortie ne s'affiche pas.
3 Réponses :
Vous devriez utiliser un nom de variable de boucle différent dans votre boucle interne, et vous devez également utiliser un long
pour stocker votre somme. En fait, j'écrirais d'abord une méthode pour multiplier jusqu'à un nombre dans la série. Comme,
2561327494111820313
Ensuite, vous pouvez l'invoquer et calculer votre somme avec une simple boucle. Comme,
long sum = 0L; for (int i = 1; i <= 20; i++) { sum += multiplyTo(i); } System.out.println(sum);
Je reçois
static long multiplyTo(int n) { long r = 1L; for (int i = 2; i <= n; i++) { r *= i; } return r; }
Bien que cela corrige le problème de l'OP - la vraie réponse ici est que la boucle interne n'est pas du tout nécessaire ...
Utilisation des flux:
long s = LongStream.rangeClosed(1, 20) .map(upper -> LongStream.rangeClosed(1, upper) .reduce(1, (a, b) -> a * b)) .sum(); System.out.println(s);
Tirages 2561327494111820313
Cela calcule le factoriel à chaque «pas», ce qui est totalement inutile. Bien qu'il s'agisse d'une jolie doublure, elle est extrêmement inefficace et s'apparente à une itération par index sur une liste chaînée.
Vous pouvez essayer celui-ci:
public class Main { public static void main (String[]args) { int fact = 1; int sum = 0; int i, j = 1; for (i = 1; i <= 20; i++) { for (j = 1; j <= i; j++) { fact = fact * j; } sum += fact; System.out.println ("sum = " + sum); fact = 1; } } }
Donnez toujours le nom de variable approprié et essayez d'éviter d'utiliser la même variable à des endroits différents, c'est-à-dire que vous avez utilisé la variable i dans la boucle externe et interne, ce qui n'est pas une bonne habitude.
Merci, le programme fonctionne, mais je voulais vous demander pourquoi vous avez initialisé à nouveau «fact» après la boucle interne?
Parce qu'après chaque itération, la valeur factorielle d'un nombre particulier est conservée et si nous trouvons la factorielle du nombre suivant, nous devons commencer par la valeur 1.
@Taus si vous en êtes sûr . Pouvez-vous voir un moyen de trouver la factorielle du nombre suivant sans boucle interne?
Utilisez une variable différente pour votre boucle intérieure. Votre boucle externe essaie d'incrémenter
i
mais votre boucle interne en la décrémentantVotre boucle while est une boucle infinie.