В то время как завершение цикла переопределено?

У меня есть эта простая программа для расчета количества зерен по отношению к квадратам:

#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;
}

Цикл печатает зерно и квадрат после каждого цикла. Это вывод в терминале:

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

Как видите, завершение цикла больше, чем условие завершения, установленное в grain < 1000.

У меня нет проблем с результатом, я просто хочу знать, почему петля превышает критерии завершения, почему она не остановилась на 512 гранах? это из-за повторения квадратов в теле цикла?


person Onome Sotu    schedule 18.03.2017    source источник
comment
Условие завершения проверяется только тогда, когда выполнение доходит до начала цикла, а не после каждого оператора в цикле.   -  person M.M    schedule 18.03.2017


Ответы (1)


Потому что

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

вместо этого вы можете изменить условие while на while(squares < 10)

or

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++;

        }
person Ravi    schedule 18.03.2017
comment
Спасибо. Теперь это намного яснее. Мне нравится первый пример, он лучше объясняет, как работает цикл. - person Onome Sotu; 18.03.2017
comment
Я хотел, но это дает мне ограничение по времени. Не могу принять ответ через столько-то минут и т. д. - person Onome Sotu; 18.03.2017