Factorial java返回0

时间:2014-04-13 20:10:45

标签: java factorial

我做了一个简单的函数来计算数字的阶乘,但从数字34返回0。它应该是51号。

   public class Métodos {
       public int factorial (int numero ){

          if ((numero <0)||(numero>50)){

           return 0;        
          } 

          else if ((numero == 0)||(numero == 1)){

           return 1;   
          }

          else{

           return numero * factorial(numero -1); 


          }

    }




    }

谢谢!

编辑:

好的,我怎么检查呢?

因为它说int不能转换为bigInteger。

 public static void main(String[] args) {
        // TODO code application logic here
         Métodos metod = new Métodos();
         System.out.print("El resultado es : " + metod.factorial(-12)+ "\n");
         System.out.print("El resultado es : " + metod.factorial(-1)+ "\n");
         System.out.print("El resultado es : " + metod.factorial(0)+ "\n");
         System.out.print("El resultado es : " + metod.factorial(1)+ "\n");
         System.out.print("El resultado es : " + metod.factorial(5)+ "\n");
         System.out.print("El resultado es : " + metod.factorial(51)+ "\n");
         System.out.print("El resultado es : " + metod.factorial(520)+ "\n");
    }

3 个答案:

答案 0 :(得分:5)

34的阶乘约为3 * 10 38 - 它不适合int,它可以保持数字高达2 * 10 9 。价值34!甚至不适合long

如果您需要计算如此大数字的阶乘,请改用BigInteger类。该类的对象可以保存任意大小的整数值。请注意,使用中缀运算符不会执行操作,但使用方法:

public BigInteger factorial (int numero ){
    if (numero < 0) {
        return BigInteger.ZERO;
    } else if (numero==0){
        return BigInteger.ONE;
    } else {
        return BigInteger.valueOf(numero).multiply(factorial(numero-1));
    }
}

答案 1 :(得分:3)

因子变得非常快。您使用的int数据类型太小,无法存储产生的巨大数字。您最多可以存储12个!在int中。切换到long,您最多可以存储20个!您需要使用BigInteger来超越它。

每个结果从34开始为0的原因是因为34!是:

295232799039604140847618609643520000000

这个数字的主要因素是:

  

2 32 ×3 15 ×5 7 ×7 4 ×11 3 ×13 2 ×17 2 ×19×23×29×31

请注意,素因子分解有32个二进制。这意味着当以二进制编写时,数字恰好以32个零结束:

1101111000011011110001001101000110011110111111001010110010000010
0100010001011101101001110101101100000000000000000000000000000000

由于int仅为32位宽,因此它仅保留该数字的低32位,均为0,并且所有位0的int表示数值0。 / p>

(我上面提到过它实际上错了;正确的结果在12!之后溢出int。然而,这是一个简单的乘法事实,当两个数相乘时,数字中的数字不会影响在较低位置的结果数字;只在相同或更高位置的数字。例如,乘以任何两个以4结尾的长数。结果必须以6结尾,无论全数是多少。这意味着即使在因子计算之后溢出int,所有低32位仍然正确!)

在34!之后,每个阶乘在其素数因子分解中将至少 32两个(因为它是前一个阶乘的简单倍数),因此当正确的值被切割以适合于int它们都是0.另一种看待它的方式是在34!之后,每个因子都被计算为0,因为它只是先前计算的0的倍数。

答案 2 :(得分:1)

1-我是葡萄牙语母语人士,请遵循我的建议:“用英语写代码。”世界更容易阅读,当您达到约定时,您的方法将具有getSomething()或setSomething(某些)等名称。

2-关于你的问题。试试:

for (int i = 0 ; i < 60; i++){
    System.out.println(i + " " + factorial(i));
}

你会看到大约12岁时你开始得到奇怪的值,因为java中的int限制为2 ^ 31-1并且你得到溢出:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

你可以尝试很长时间。但这也会在51之前很久就会溢出。

您必须使用处理任意值的BigInteger类。

public static BigInteger factorial(BigInteger number) {
    if ((number.compareTo(BigInteger.ZERO) == 0)
            || (number.compareTo(BigInteger.ONE) == 0)) {
        return BigInteger.ONE;
    } else {
        return number.multiply(factorial(number.subtract(BigInteger.ONE)));
    }
}