我正在写一个Java程序来对大素数做一些计算,我得到了这个错误:
Exception in thread "main" java.lang.NumberFormatException: For input string: "1.0"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.math.BigInteger.<init>(BigInteger.java:338)
at java.math.BigInteger.<init>(BigInteger.java:476)
at Solution.sumOfDivisorsModulo(Solution.java:24)
at Solution.main(Solution.java:49)
public static BigInteger sumOfDivisorsModulo(BigInteger n){
BigInteger sum = (n.add(one)).mod( MODULO);
for (BigInteger test = n.subtract(one); test.compareTo(new BigInteger(Double.toString(Math.sqrt(n.longValue())))) >= 0; test.subtract(one))
{
if(n.mod(test).compareTo(zero) == 0)
{
sum = sum.add(test);
sum = sum.add(n.divide(test));
sum = sum.mod(MODULO);
}
}
return sum;
}
public static void main(String[] args) {
int m = 2;
int a = 0;
primeList = new BigInteger[m];
fillList(m); // fills the list primeList with prime number up to the mth
BigInteger n = new BigInteger("1");
for (int i = 0; i < m; i++){
n.multiply(primeList[i].pow(a+i));
}
System.out.println(sumOfDivisorsModulo(n).toString()); // base10
}
one
和zero
是定义为BigInteger("0")
和BigInteger("1")
的变量。
你能帮我弄清楚问题是什么吗?我提前谢谢你。
答案 0 :(得分:1)
问题出在这里。
new BigInteger(Double.toString(Math.sqrt(n.longValue())))
Double.toString()
调用将为您提供一个带小数点的数字字符串。但是BigInteger(String)
构造函数无法解析带有小数点的数字字符串。
我不明白你在这里要做什么,但平方根可能是一个非整数值。
如果您打算将浮点(可能是非整数)平方根值转换为整数,那么:
// Round towards zero / truncate
BigInteger.valueOf((long)(Math.sqrt(n.longValue())))
或
// Round to nearest
BigInteger.valueOf((long)(Math.round(Math.sqrt(n.longValue()))))
这比通过字符串更有效。通过int
字符串可能会很快溢出。
但请注意,对于足够大的n
值,平方根计算将明显不准确。除了查找或实现您自己的BigInteger
平方根方法之外,没有其他解决方案。但是,如果@Andreas是正确的,并且您根本不需要使用BigInteger
,这是没有用的。