构造函数BigInteger(long)不可见

时间:2016-06-14 05:52:47

标签: java

所以我正在使用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 + ""))

我的问题是,为什么我们要添加那个空字符串?

6 个答案:

答案 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,

的javadoc中提供
  

返回一个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能够持有它。