0
votes

Comment trouver la somme des factorielles de tous les nombres d'une série?

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.


2 commentaires

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émentant


Votre boucle while est une boucle infinie.


3 Réponses :


0
votes

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;
}


1 commentaires

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 ...



0
votes

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


1 commentaires

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.



1
votes

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.


3 commentaires

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?