2016-12-31 5 views
-1

나는 큰 소수에 대한 몇 가지 계산을 수행하는 자바 프로그램을 쓰고 있어요, 나는이 오류를 얻을 :예외 : 입력 문자열 : "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 
} 

oneBigInteger("0")zeroBigInteger("1")과 같이 정의 된 변수이다. 문제의 원인을 파악하는 데 도움을 줄 수 있습니까? 미리 감사드립니다.

+1

저에게있어서, 특히 NumberFormatException : For input string : "1.0"오류 메시지는 매우 명확합니다. 특히 _double_ 값으로'BigInteger'를 만들려고 할 때 특히 그렇습니다. BigDecimal을 사용하고 싶었 을까? – Seelenvirtuose

+0

내장되어있을 때 왜 자신의 '하나'와 '제로'를 정의해야합니까? ['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

나는 그것을 얻었고, 나의 경우에는 수학을 사용했다. 바닥. 감사. – Marrakchino