我找到阶乘的代码不起作用。请有人找到错误

时间:2016-09-17 08:09:52

标签: java

这是我的代码:

使用递归

找不到更多的数字是不行的
import java.util.*;
import java.lang.*;

class Main
{   

 static String fib(int f)
{
    if(f!=1)
     return ""+(f*(Integer.parseInt(fib(f-1))));
    else 
     return "1";
}

public static void main(String[] args) throws java.lang.Exception
{

    Scanner sc= new Scanner(System.in);
    int f= sc.nextInt();
    int a[]=new int[f];
    int i;
        for( i=0;i<f;i++)
       a[i]=sc.nextInt();

    for( i=0;i<f;i++)
    System.out.println(fib(a[i]));
}

}

2 个答案:

答案 0 :(得分:0)

这是类型整数范围的问题(2147483647)。如果你只是用long替换int(范围9223372036854775807)

import java.util.*;

class Main
{   
    static String fib(long f)
    {
        if(f!=1)
            return ""+(f*(Long.parseLong(fib(f-1))));
        else 
            return "1";
    }
    public static void main(String[] args) throws java.lang.Exception
    {
        Scanner sc = new Scanner(System.in);
        int f = sc.nextInt();
        long a[] = new long[f];
        int i;
        for(i = 0; i<f; i++)
            a[i] = sc.nextLong();
        for(i = 0; i<f; i++)
            System.out.println(fib(a[i]));
    }
}

然后程序已经可以计算21下的所有内容!但是如果你使用double,那么它应该使用更高的数字,因为double的范围是1.7976931348623157E308。加倍,最大工作因子计算为170!

PS:我是德国人,所以如果我写错了英语,我很抱歉

答案 1 :(得分:-2)

代码逻辑没有错误。由于您使用int,其范围比25以外的数字因子短,因此输出错误。相反,请使用long或更优选BigInteger

注意:您必须 导入 包含java.math类的BigInteger包才能使用此类型。

static BigInteger fib(BigInteger f) {
    if (!f.equals(BigInteger.ONE))
        return f.multiply(fib(f.subtract(BigInteger.ONE)));
    else
        return BigInteger.ONE;
}

public static void main(String[] args) throws java.lang.Exception {

    Scanner sc = new Scanner(System.in);
    int f = sc.nextInt();
    int a[] = new int[f];
    int i;
    for (i = 0; i < f; i++)
        a[i] = sc.nextInt();

    for (i = 0; i < f; i++)
        System.out.println(fib(new BigInteger(String.valueOf(a[i]))));
    }
}