大多数输入程序工作良好,但当我使用大的数字,例如20的值是不正确的。有没有一种方法可以把十进制数转换成二进制?谢谢你。
int n = Comp122.getInt("What number would you like to make a factorial?");
int factorial = 1;
for (int i = 1 ; i<=n ; i++) {
factorial*=i;
System.out.println(factorial);
}
您在13!
遇到整数溢出,这超过了int
所能容纳的最大数字,即231(约2.1 x 109)。
您可以将变量的类型从int
更改为long
,它可以容纳263(约1.9 x 1019),但这也将超过20!
的限制要处理任意大的数字,请使用BigInteger
类作为变量类型。你的代码会像这样:
BigInteger factorial = BigInteger.ONE;
for (int i = 2; i < n; i++) {
factorial = factorial.multiply(néw BigInteger(i + ""));
}
顺便说一下,要将整数输出为二进制或十六进制:
System.out.println(Integer.toBinaryString(n));
System.out.println(Integer.toHexString(n));
n!会变得非常大,可能Integer不能容纳它,因为Integer有2147,483,647的限制。
这不是输出的问题,而是您遇到了溢出。如果你有一个无限范围的输入可能适合BigInteger,你可以尝试BigInteger。否则,您可能希望使用一些无限制的数据结构,例如String。并逐位计算
例如:https://www.geeksforgeeks.org/multiply-large-numbers-represented-as-strings/
20值不正确?
value = 20!= 2432902008176640000 .
在java中,整数可以正确处理小于2,147,483,648的任何正值。
int | 4 bytes | Stores whole numbers from -2,147,483,648 to 2,147,483,647
所以,使用int不能处理这种类型的大值
long
数据类型只能用于n <= 20的阶乘。
对于较大的n值,可以使用java中的BigInteger类。math包,它可以保存最多2^Integer的值。MAX_VALUE: