问题描述
该程序的大多数输入都可以正常工作,但是当我使用大数字时,例如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!
处遇到 integer overflow,它超过了 int
可以容纳的最大数,即 231(约 2.1 x 10 9).
您可以将变量的类型从 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 有 2,147,483,647 的限制。
那不是输出的问题,而是你遇到了溢出。 如果您有可能适合 BigInteger 的无限输入范围,您可以尝试 BigInteger。否则,您可能想使用一些无限制的数据结构,例如 String。并逐位计算。
类似于:https://www.geeksforgeeks.org/multiply-large-numbers-represented-as-strings/
,20 值不正确?
值为 20! = 2,432,902,008,176,640,000。
在java中,整数可以正确处理任何小于2,648的正值。
int | 4 bytes | Stores whole numbers from -2,648 to 2,647
因此,使用 int 无法处理这种类型的大值。
long
数据类型只能用于 n
对于较大的 n 值,我们可以使用 java.math 包中的 BigInteger 类,该类最多可容纳 2^Integer.MAX_VALUE: