所以我正在使用BigInteger类创建一个阶乘程序。但我不断收到上述错误。
public static BigInteger fact(long n){
BigInteger result = BigInteger.ONE;
for(int i = 1; i <= n; ++i){
result = result.multiply(new BigInteger(i));
}
return result;
}
我已经找到了修复,只是添加一个带结果的空字符串。
result = result.multiply(new BigInteger(i + ""))
我的问题是,为什么我们要添加那个空字符串?
答案 0 :(得分:11)
根据oracle docs,BigInteger没有任何以int作为参数的构造函数
其次,您应该使用BigInteger.valueOf(i);
代替new BigInteger(i + "")
答案 1 :(得分:2)
显示正确的错误。如果您查看the BigInteger
class in the documentation,则可以看到没有接受int
的构造函数。因此,您无法使用new
并传递int
来创建BigInteger对象。
有一个接受字符串的构造函数,通过添加一个空字符串,您将int转换为字符串。
您可以使用以下代码:
int myint = 5; // For example
BigInteger myBigInter = BigInteger.valueOf(myint);
答案 2 :(得分:1)
当你在构造函数参数中添加一个空字符串时,java编译器会将你的参数转换为字符串:5 +&#34;&#34; - &GT; &#34; 5&#34 ;.由此产生的结果是java将使用带有String参数的BigInterger构造函数。这就是您的代码有效的原因。
/**
* Translates the decimal String representation of a BigInteger into a
* BigInteger. The String representation consists of an optional minus
* sign followed by a sequence of one or more decimal digits. The
* character-to-digit mapping is provided by {@code Character.digit}.
* The String may not contain any extraneous characters (whitespace, for
* example).
*
* @param val decimal String representation of BigInteger.
* @throws NumberFormatException {@code val} is not a valid representation
* of a BigInteger.
* @see Character#digit
*/
public BigInteger(String val) {
this(val, 10);
}
所以要使用干净的代码使用这个:
new BigInteger(Integer.toString(i), 10)
答案 3 :(得分:1)
123+""
与Integer.toString(123)+""
相同,即将空字符串添加到整数将该整数转换为字符串。
并且根据docs BigInteger有一个构造函数,它将整数的十进制字符串作为参数。
正如SpringLearner所提到的,BigInteger没有一个仅以int
为参数的构造函数。
答案 4 :(得分:1)
带有long的BigInteger构造函数是私有的,因为库开发人员希望您调用BigInteger.valueOf(long l)
。构造函数为private的原因在valueOf,
返回一个BigInteger,其值等于指定值 {@code long}。优选提供这种“静态工厂方法” 到({@code long})构造函数,因为它允许重用 经常使用BigIntegers。
答案 5 :(得分:0)
BigInteger
没有接受int
的构造函数。
通过添加空字符串,i
将转换为String
。
您也可以执行new BigInteger(String.valueOf(i))
编辑:
为什么必须使用String
?
如果您需要的值大于BigInteger
甚至Integer.MAX_VALUE
,则会{常常}使用Long.MAX_VALUE
。因此,如果要创建一个包含大于该值的BigInteger
,则需要将其作为可以保存该值的对象/变量传递。而String
能够持有它。