我可以找到所有可用的在线解决方案,BigInteger
但必须使用数组来解决。
我只是一个初学者,我什至把它带到了我的计算机科学俱乐部,甚至无法弄清楚。
每当我输入大于的数字时31
,输出始终为零。
另外,当我输入一个大于的数字时12
,输出总是不正确。
例如在应该fact(13)
返回1932053504
时返回6227020800
这是我到目前为止的内容:
import java.util.Scanner;
class Fact
{
public static void main(String[] args)
{
Scanner kb = new Scanner(System.in);
System.out.println("Enter the number you wish to factorial");
int x = kb.nextInt();
System.out.println(fact(x));
}
public static int fact(int x)
{
int[] a = new int[x];
int product = 1;
for(int i = 0; i < a.length; i++)
{
a[i] = x;
x--;
}
for(int i = 0; i < a.length; i++)
{
product = product * a[i];
}
return product;
}
}
最大值使大数变糟
对于长期:
2^63 - 1
9223372036854775807
9 quintillion 223 quadrillion 372 trillion 36 billion 854 million 775 thousand 807
对于整数:
2^31 - 1
2147483647
2 billion 147 million 483 thousand 647
(我在上面写上名字来显示尺寸)
在计算过程中的任何时间点,您都会遍历这些“最大值”,您将使变量溢出,从而导致其行为与预期不同,有时会导致形成奇怪的零。
即使BigInteger
s也会有问题,尽管它可以上升到比正数高得多的数字longs
,ints
这就是为什么它们与生成大量数字(例如阶乘)的方法一起使用的原因。
您似乎想避免使用BigInteger
并且仅使用原始函数,因此long
它将是您可以使用的最大数据类型。
即使将所有内容都转换为long
(当然,除了数组迭代器之外),您也只能精确计算最多20个阶乘。超出此范围的任何内容都会使变量溢出。这是因为21!长时间超过“最大值”。
简而言之,您将需要使用BigInteger
或创建自己的类来计算大于20的数字的阶乘。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句