2016-12-31 3 views
-1

J'écris un programme Java pour faire des calculs sur de grands nombres premiers, je reçois cette erreur:Exception dans le thread « principal » java.lang.NumberFormatException: Pour chaîne d'entrée: « 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 
} 

one et zero sont des variables définies comme BigInteger("0") et BigInteger("1"). Pouvez-vous m'aider à comprendre quel est le problème? Je vous remercie d'avance.

+1

Pour moi, le message d'erreur 'NumberFormatException: Pour la chaîne d'entrée:" 1.0 "' est très clair, en particulier lorsque vous essayez de créer un 'BigInteger' avec une valeur _double_. Peut-être que vous vouliez utiliser 'BigDecimal'? – Seelenvirtuose

+0

Pourquoi définir vos propres 'one' et' zero' quand ils sont intégrés? Voir ['BigInteger.ONE'] (https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#ONE) et [' BigInteger.ZERO'] (https: // docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html#ZERO). – Andreas

+0

En outre, vous savez que 'sum.add (test)' et 'sum.add (n.divide (test))' ne fera rien, non? Vous avez oublié d'affecter le résultat à "somme". Vous l'avez bien fait avec 'sum = sum.mod (MODULO)'. – Andreas

Répondre

1

Le problème est ici.

new BigInteger(Double.toString(Math.sqrt(n.longValue()))) 

L'appel Double.toString() va vous donner une chaîne numérique avec un point décimal en elle. Mais le constructeur BigInteger(String) ne peut pas analyser une chaîne numérique avec un point décimal.

Je ne comprends pas ce que vous essayez de faire ici, mais la racine carrée est susceptible d'être une valeur non-entière.

Si votre intention est de convertir le point flottant (éventuellement non entier) valeur racine carrée à un nombre entier, puis:

// Round towards zero/truncate 
    BigInteger.valueOf((long)(Math.sqrt(n.longValue()))) 

ou

// Round to nearest 
    BigInteger.valueOf((long)(Math.round(Math.sqrt(n.longValue())))) 

Cela devrait être plus efficace que aller par l'intermédiaire d'une chaîne. Et passer par une chaîne int risque de déborder plus tôt. Notez toutefois que pour les valeurs suffisamment grandes de n, le calcul de la racine carrée sera sensiblement inexact. Il n'y a pas de solution à part trouver ou implémenter votre propre méthode racine carrée BigInteger. Cependant, si @Andreas est correct et que vous n'avez pas du tout besoin d'utiliser BigInteger, ceci est discutable.

+0

Je vois. Alors comment puis-je créer une variable BigInteger à partir d'un double? – Marrakchino

+0

@Marrakchino Cela dépend. Voulez-vous que la valeur 'double' soit tronquée ou arrondie? – Andreas

+0

Je l'ai eu, dans mon cas, j'ai utilisé Math.floor. Merci. – Marrakchino