【问题标题】:My code for finding factorial is not working. Please somebody find the error我查找阶乘的代码不起作用。请有人找到错误
【发布时间】:2017-01-25 10:49:43
【问题描述】:

这是我的代码:

使用递归查找阶乘对更大的数字不起作用

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

}

【问题讨论】:

  • 究竟是什么不工作?请注意,阶乘变得非常大并且很容易超出整数范围。改用双打。此外,您的代码可能运行非常缓慢。你为什么要返回字符串?只需按原样返回数字!
  • 您要达到多大的数字?在为大量生成阶乘时,这也是关于存储和实现逻辑的全部内容
  • 对于 50 大的数字,我没有得到正确的输出。它适用于较小的数字。我返回 String 是因为阶乘可能非常大,并且输出可能超出 int 或 long 的范围。
  • 当你接下来做Integer.parseInt(fib(f-1))时使用String并没有真正帮助,试图将String转换为int,这将失败,因为数字太大了一个整数。
  • 您的代码显示 0 对应于 0!,这是错误的。 0! = 1.

标签: java


【解决方案1】:

这是整数(2147483647)类型范围的问题。如果您只是像这样将 int 替换为 long (范围 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。使用 double 时,最大工作阶乘计算为 170!。

PS:我是德国人,所以如果我写错英文对不起

【讨论】:

    【解决方案2】:

    您的代码逻辑没有错误。由于您使用int,其范围比25 以外的数字的阶乘更短,因此您会得到错误的输出。相反,请使用long,或者更可取的是BigInteger

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

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

    【讨论】:

    • 非常感谢先生的解决方案!!您能否也帮我找出我提到的代码中的错误。
    • 代码没有错误。只需计算大数的阶乘并将其与int primitive size 进行比较,您就会知道在int 原语中无法容纳大于int primitive size 的大数。 int range is -2,147,483,648 to 2,147,483,647
    • 有人对我的回答投了反对票,如果你能解释一下反对票的原因会很好。
    • 如果你提出更好的建议然后来反对我的回答,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2021-08-31
    • 2015-10-23
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多