2016-12-31 5 views
-1

私は大きな素数で、いくつかの計算を行うためのJavaプログラムを書いて、私はこのエラーを取得する:例外:入力文字列の場合:「1.0」

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 
} 

onezeroBigInteger("0")BigInteger("1")として定義された変数です。 問題が何であるか把握するのに手伝ってもらえますか?私は事前に感謝します。

+1

エラーメッセージ 'NumberFormatException:入力文字列:1.0 'は非常に明確です。特に、_double_値を持つ' BigInteger'を作成しようとすると、明らかです。おそらく、あなたは 'BigDecimal'を使いたいでしょうか? – Seelenvirtuose

+0

組み込み時に独自の 'one'と' zero'を定義するのはなぜですか? ['BigInteger.ONE'](https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#ONE)と[' BigInteger.ZERO'](https:// docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#ZERO)。 – Andreas

+0

また、 'sum.add(test)'と 'sum.add(n.divide(test))'は何もしませんよね?結果を 'sum'に代入するのを忘れました。あなたは 'sum = sum.mod(MODULO)'でそれを正しく得ました。 – Andreas

答えて

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をまったく使用する必要はありませんが、これは疑問です。

+0

私は参照してください。次に、doubleからBigInteger変数を作成するにはどうすればよいですか? – Marrakchino

+0

@Marrakchinoそれは異なります。 'double'の値を切り捨てるか丸めたいですか? – Andreas

+0

私はそれを得ました、私の場合、私はMath.floorを使用しました。ありがとう。 – Marrakchino

関連する問題