2013-07-19 2 views
-3

+ = produit des résultats différents voir le code ci-dessous ... le code avec temp fonctionne correctement pas l'autre vous pouvez déboguer ceci en créant une application java.Java + = l'opérateur "arrête d'ajouter après certain nombre"

public long JavaStopsAdding(int treeHeight) { 

    long cars = 0; 
    long cars1 = 0; 
    int i = 0; 
    while (treeHeight - i >= 0) { 

     long temp = 0; 

     if (treeHeight - i == 0) { 
      cars += 1; 
      cars1 += 1; 
      break; 
     } 


     // working code start 

      temp = (long) ((Math.pow(2,treeHeight- i))/2); 
     cars1 += temp; 
      System.out.print("temp " + (treeHeight- i) + " cars " + cars1 +"\n"); 
    // working code END 

      // NON working code Start 
      cars += ((Math.pow(2,treeHeight- i))/2); 
    System.out.print("temp " + (treeHeight- i) + " cars " + cars + "\n"); 
     // NON working code END 
     i += 2;  
    } 
    return cars; 
} 
+0

Qu'entendez-vous par arrêts? Quel est le i/p et attendu o/p? – NINCOMPOOP

+0

Quelle est la question? Qu'essayez-vous de faire? –

+0

avez-vous essayé 'cars + = (long) ((Math.pow (2, treeHeight-i))/2);'? –

Répondre

4

Il n'y a probablement aucun problème avec + =. Au lieu de cela, le problème est que votre valeur déborde.

Vous ne devriez pas utiliser Math.pow(2, n), utilisez plutôt 1L << n qui est non seulement plus rapide mais plus susceptible de fonctionner. De toute façon, vous ne pouvez pas avoir n> 62 et attendez que cela fonctionne.

+1

Plus le 'n' est grand, plus le' k' sera bas avant que 'n << k' ne commence à échouer pour vous. Si 'n == 1' vous obtenez un' k' allant jusqu'à '62' et soyez toujours peachy. Si 'n == 4', alors votre' k' sera seulement '60'. Peut-être que OP devrait considérer BigInteger? – corsiKa

+0

@corsiKa ou un BitSet pour définir le n-ième bit. –

+0

vous avez raison, mais pourquoi cela débordera-t-il? avec la temp fonctionne mais pas Math directement ... quel est le fondement derrière ce ... – Indra

-1

J'ai testé le code avec treeheight = 10 et trouve tout normal. votre code contient deux variables voitures1 et voitures:

// working code start 

temp = (long) ((Math.pow(2,treeHeight- i))/2); 
cars1 += temp; 
System.out.print("temp " + (treeHeight- i) + " cars " + cars1 +"\n"); 
// working code END 

// NON working code Start 
     cars += ((Math.pow(2,treeHeight- i))/2); 
System.out.print("temp " + (treeHeight- i) + " cars " + cars + "\n"); 
    // NON working code END 
+0

essayez 60 comme hauteur – Indra

1

Utilisez BigInteger comme opération mathématique entraînant un débordement.

Questions connexes