我想用java程序计算50的阶乘,而不使用数组
这是我的程序吗我想用java程序计算50的阶乘,而不使用数组,java,factorial,Java,Factorial,这是我的程序吗 `class Factorial { public static void main(String dt[]) { long n=50; long fact=1; if(n==0) { System.out.println("Factorial is 1"); } else if(n==1) { System.out.println("Factorial is 1"); } e
`class Factorial
{
public static void main(String dt[])
{
long n=50;
long fact=1;
if(n==0)
{
System.out.println("Factorial is 1");
}
else if(n==1)
{
System.out.println("Factorial is 1");
}
else
{
fact=n;
while(n>1)
{
fact=fact*(n-1);
n--;
}
System.out.print("Factorial is "+fact);
}
}
}`
它不计算50的阶乘。我想在不使用数组和大整数的情况下计算它。阶乘是一个快速增长到无穷大的数学函数,您的代码是错误的,因为使用的long短于该范围(到21!您已经有溢出) 您需要使用另一种数据类型,如大整数 使用BigInteger的重构方法如下所示:
private static void factorial(long n) {
long x = n;
BigInteger fact = BigInteger.ONE;
if ((n == 0) || (n == 1)) {
System.out.println("Factorial is 1");
} else {
fact = BigInteger.valueOf(n);
while (n > 1) {
fact = fact.multiply(BigInteger.valueOf(n - 1));
n--;
}
System.out.println("Factorial of " + x + " is " + fact);
}
}
注意21的输出!直到50岁!那可能是
21的阶乘为51090942171709440000
22的阶乘是11240007277607680000
23的阶乘为25852016738884976640000
24的阶乘是620448401733239439360000
25的阶乘是155112100433309885984000000
26的阶乘是4032914611260605684000000
27的阶乘是10888869450418352160768000000
28的阶乘为30488834461171386050150400000
29的阶乘是8841761993739701954543616000000
30的阶乘为26525285981219105863084800000000
31的阶乘是82228386541779228177255628800000
32的阶乘为263130836933693530167218012160000000
33的阶乘为86833176188118864955181944012800000000
34的阶乘是295232799039360414084761860943520000000
35的阶乘为103331479663861449296666513375232000000
36的阶乘是3719933267899012746799944815083520000000
37的阶乘是137637530912263450463159795815809024000000000
38的阶乘为523022617466601111760007224100074291200000000
39的阶乘为20397882081197443358640281739902897335680000000
40的阶乘是8159152832478973434561126959615894272000000
41的阶乘为334522613163807108170062053440751665152000000000
42的阶乘是1405006117752879898543142606244511569936384000000000
43的阶乘是604152630633738356373551320685139975072645120000000000
44的阶乘为26582715747884487680436281811014615890031963852800000000
45的阶乘为11962222086548019456196316149567715064383733760000000000
46的阶乘为550262215981208894985030542880025489296165175296000000000
47的阶乘为2586324151168180642964355153611979691976323891200000000000
48的阶乘是12413915592536072670862289047337503852148635467776000000000
49的阶乘为6082818640342675608722521332129537688755283179210240000000000
50的阶乘是3041409320171337804361260816606476884437764156896051200000000
publicstaticvoidmain(字符串[]args){
长n=50;
BigInteger事实=BigInteger.valueOf(1);
对于(int i=1;i程序的输出超过了长实例可以保存的最大值。因此,您可以使用java.math包的biginger来代替long,它可以容纳更大的值。然后您必须实现自己的大整数,并使用一些数据结构来存储结果的数字(以及中间结果).along
可以容纳的最大值是9223372036854775807,但是fact(50)
大约是3E64
-因此变量溢出。请使用float
或biginger
。
public static void main(String[] args) {
long n=50;
BigInteger fact= BigInteger.valueOf(1);
for(int i=1;i<n-1;i++)
{
fact = fact.multiply(BigInteger.valueOf(n - 1));
}
System.out.print("Factorial is "+fact);
}