【问题标题】:How to find the sum of factorial of all numbers in a series?如何找到系列中所有数字的阶乘之和?
【发布时间】:2019-05-21 04:16:02
【问题描述】:

我想创建一个程序来查找系列中所有数字的阶乘总和,直到 20。 我必须在 s = 1 + (1*2) + (1*2*3) + ...(1*2*3...20) 中找到“s”。 我尝试了一个程序,但它不起作用。我正在使用 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);

编译器没有显示任何错误消息,但是当我运行程序时,JVM(Java 虚拟机)一直在加载,并且没有显示输出屏幕。

【问题讨论】:

  • 为您的内部循环使用不同的变量。您的外部循环正在尝试增加 i,但您的内部循环正在减少它
  • 你的 while 循环是一个无限循环。

标签: java bluej


【解决方案1】:

你可以试试这个:

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

总是给出正确的变量名,并尽量避免在不同的地方使用相同的变量,即你在外循环和内循环中都使用变量 i,这是不好的习惯。

【讨论】:

  • 谢谢,程序确实可以运行,但我想问一下为什么你在内部循环之后又初始化了“fact”?
  • 因为在每次迭代后事实都会保存特定数字的阶乘值,如果我们找到下一个数字的阶乘,那么我们必须从值 1 开始。
  • @Tausif 你确定。你能找到一种没有内部循环的方法来找到下一个数字的阶乘吗?
【解决方案2】:

您应该在内部循环中使用不同的循环变量名称,并且您还需要使用long 来存储您的总和。事实上,我会首先编写一个方法来乘以系列中的一个数字。喜欢,

static long multiplyTo(int n) {
    long r = 1L;
    for (int i = 2; i <= n; i++) {
        r *= i;
    }
    return r;
}

然后您可以调用它并通过一个简单的循环计算您的总和。喜欢,

long sum = 0L;
for (int i = 1; i <= 20; i++) {
    sum += multiplyTo(i);
}
System.out.println(sum);

我明白了

2561327494111820313

【讨论】:

  • 虽然这解决了 OP 的问题 - 这里真正的答案是根本不需要内部循环......
【解决方案3】:

使用流:

    long s = LongStream.rangeClosed(1, 20)
        .map(upper -> LongStream.rangeClosed(1, upper)
            .reduce(1, (a, b) -> a * b))
        .sum();
    System.out.println(s);

打印2561327494111820313

【讨论】:

  • 这会计算每个“步骤”的阶乘,这完全没有意义。虽然是一个可爱的单行,但它的效率非常低,类似于通过链表上的索引进行迭代。
【解决方案4】:

我使用 Scanner Class 做了同样的程序

import java.util.*;
class Sum_Factorial
{
    public static void main()
    {
        Scanner in = new Scanner(System.in);
        int i; //Denotes Integer
        int n; //Denotes Number
        int f=1; //Denotes Factorial
        int s=0; //Denotes Sum
        System.out.println("Enter the value of N : ");
        n=in.nextInt();
        for(i=1; i<=n; i++)
        {
            f=f*i;
            s=s+f;
        }
        System.out.println("Sum of the factorial numbers is "+s);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 2016-12-28
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多