【问题标题】:Analyzing factorial loop in Java分析Java中的阶乘循环
【发布时间】:2015-10-04 02:31:29
【问题描述】:

考虑以下代码:

int number;
double factorial = 1.0;

for(int i=2; i<=5; i++)
{
    factorial *=i;
    System.out.println(number + "! = " + factorial );
}

为什么是输出

2.0
6.0
24.0
120.0

我知道从 2 点到 5 点。

【问题讨论】:

  • 问题不清楚,但你看到 2.0 而不是 2 的原因是因为阶乘是双精度数,而不是整数。默认情况下它会像这样打印出来。
  • 你知道什么是阶乘吗?你知道 4!=24 和 5!=120 吗?
  • 就像@ergonaut 所说,这不是一个非常明确的问题。编辑它以解决您关于相关代码的具体问题,并显示完整的输出,而不是截断的版本。
  • 我打算乘以双倍,但我还不明白为什么我得到 6.0 / 24.0 / 120.0 因为我知道 1.0*2=2.0 秒应该是 1.0*3 =3.0,但我得到了 6.0 为什么???其余 24.0 和 120.0
  • 如何获得输出..?代码一定是编译错误。变量号未初始化..

标签: java loops for-loop logic


【解决方案1】:
factorial *=i; 

表示阶乘=i*阶乘;

事实变量范围是循环外的中继,因此它不会在每次循环迭代时重置

所以当 i=2 时,阶乘 = 2.0

当 i=3 时,上面计算的时间阶乘值为 2.0,因此阶乘 = 2.0*3 即 6

当 i=4 时那个时间阶乘 = 6*4 =24.0

当 i=5 时那个时间阶乘 = 24*5 = 120.0

【讨论】:

  • 阶乘采用前一个的结果。即当 i=2, 1.0*2=2.0 然后阶乘使用 2.0 到 * 到 3 等等。
【解决方案2】:

我认为您想使用long(不是double,因为您使用了double,所以您获得了浮点类型)。阶乘通常是整数类型。类似的,

long factorial = 1;
for (int i = 2; i <= 5; i++) {
    factorial *= i;
    System.out.println(i + "! = " + factorial);
}

我得到(预期的)

2! = 2
3! = 6
4! = 24
5! = 120

【讨论】:

  • 我打算乘以双倍,但我还不明白为什么我得到 6.0 / 24.0 / 120.0 因为我知道 1.0*2=2.0 秒应该是 1.0*3 =3.0,但我得到了 6.0 为什么???其余 24.0 和 120.0
  • @ForlanAnWest 不,第二个是 2*3。第三个是4*3*2。
【解决方案3】:
factorial *= i;

相当于:

factorial = factorial * i;

假设factorial1.0i2

那么微积分将是:

factorial = 1.0 * 2

以此类推,直到循环结束。

【讨论】:

  • 很好,但为什么我在 3=6.6 和 4=24.0 和 5=120.0 中返回?
  • @ForlanAnWest 那么问题是什么? :)
  • 因为在循环的第一次迭代之后,“阶乘”变为 2.0,在下一次迭代中它就像 2.0 * 3 = 6.0,这是根据阶乘的数学定义
【解决方案4】:
int number;


for(int i=2; i<=5; i++)
{
  double factorial = 1.0;
  factorial *=i;
  System.out.println(number + "! = " + factorial );
}

上面的代码将给出输出 2.0、3.0 ... 因为循环中的每次迭代都会创建新变量“阶乘”并将其初始化为 1.0

但有

int number;
double factorial = 1.0;

for(int i=2; i<=5; i++)
{
factorial *=i;
System.out.println(number + "! = " + factorial );
}

对于 i=2

阶乘 = 阶乘 *i // 即。 1.0 *2 = 2.0;阶乘的新值为 2.0 即。阶乘 = 2.0

对于 i=3

factorial = factorial *3 // 即。 2.0 * 3 =6.0;这是阶乘(当 i=1 时)乘以 3

对于 i=4

factorial = factorial(when i=2) * 4 // 即。 6.0 *4 = 24.0

【讨论】:

    【解决方案5】:
    • 1*2 = 2
    • 2*3 = 6
    • 6*4 = 24
    • 24*5 = 120

    我猜,输出是对的而已

    1,2,6,24 是在先前迭代期间存储在阶乘 var 中的结果

    2,3,4,5是for循环i值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多