2017-03-18 15 views
0

I ont ce programme simple pour calculer le nombre de grains par rapport aux carrés:Alors que la terminaison de boucle est remplacée?

#include "library/std_lib_facilities.h" 

/*There is an old story that the emperor wanted to thank the inventor of the game of chess and asked the inventor to name 
his reward. The inventor asked for one grain of rice for the first square, 2 for the second, 4 for the third, and so on, 
doubling for each of the 64 squares. That may sound modest, but there wasn’t that much rice in the empire! Write a 
program to calculate how many squares are required to give the inventor at least 1000 grains of rice, at least 1,000,000 
grains, and at least 1,000,000,000 grains.*/ 

int main() 
{ 
    int grains = 1; 
    int squares = 1; 

    while(grains < 1000) { 
     squares++; 
     grains *=2; 
     cout << grains << " rice grains for " << squares << " squares" << '\n'; 
    } 
    return 0; 
} 

La boucle imprime la boucle après chaque grain et carré. Ceci est la sortie dans le terminal:

2 rice grains for 2 squares 
4 rice grains for 3 squares 
8 rice grains for 4 squares 
16 rice grains for 5 squares 
32 rice grains for 6 squares 
64 rice grains for 7 squares 
128 rice grains for 8 squares 
256 rice grains for 9 squares 
512 rice grains for 10 squares 
1024 rice grains for 11 squares 

Comme vous pouvez le voir, la fin de la boucle est supérieure à la condition de terminaison qui est fixé à grain < 1000.

Je n'ai aucun problème avec le résultat, je veux juste savoir pourquoi la boucle dépasse les critères de terminaison, pourquoi ne s'est-elle pas arrêtée à 512 grains? est-ce à cause de l'itération des carrés dans le corps de la boucle?

+2

La condition de terminaison est testée que lorsque l'exécution est le début de la boucle - pas après chaque déclaration dans la boucle –

Répondre

2

Parce que

while(grains < 1000) { //when grain value is 512, which is true. 
     squares++; 
     grains *=2; //become 1024 
     cout << grains << " rice grains for " << squares << " squares" << '\n'; 
    } 

à la place, vous pouvez changer votre état while pour while(squares < 10)

ou

int grains = 2; 
int squares = 2; 
while(grains < 1000) { //when grain value is 1024, which is false. 
      cout << grains << " rice grains for " << squares << " squares" << '\n'; 
      grains *=2; 
      squares++; 

     } 
+0

merci. C'est beaucoup plus clair maintenant. J'aime le premier exemple, cela explique mieux le fonctionnement de la boucle. –

+0

Ensuite, vous pouvez accepter la réponse – Ravi

+0

Je voulais, mais cela me donne une restriction de temps. Impossible d'accepter la réponse dans un ou plusieurs minutes, etc. –