我做了一个简单的函数来计算数字的阶乘,但从数字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");
}
答案 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)));
}
}