Почему значение переменной достигает 5050 после увеличения через два цикла?(цикл до 100) - PullRequest
2 голосов
/ 07 апреля 2019

Я читаю книгу для начинающих по программированию на С, в которой есть некоторые упражнения. Это один из них, заданный вопрос, что будет результатом следующего цикла ...

int main()
{
    int result = 0;

    for (int i = 1; i <= 100; i++)
    {
        for (int j = 1; j <= i; j++)
        {        
            result++;
        }
    }      

    printf("%d", result);

    return 0;
}

мой «рациональный» ответ был бы 1000, но почему правильный ответ 5050?

Ответы [ 2 ]

4 голосов
/ 07 апреля 2019

В первый раз внутренний цикл будет запущен один раз, потому что i равен 1, добавляя 1 к result. Во второй раз он будет запущен дважды, потому что i равен 2, добавляя 2 к result В третий раз внутренний цикл будет выполняться трижды, потому что i равен 3, добавляя 3 к result. И так до тех пор, пока 100.

В конечном итоге это добавляет 1 + 2 + 3 + 4 + … + 97 + 98 + 99 + 100 к result. Это значение 5050: номер треугольника 100 th .

Если ваш компилятор умный (например, gcc -O2), он поймет тот факт, что самый внутренний цикл - просто инкремент, и скомпилирует:

for (int i = 1; i <= 100; i++)
{
    for (int j = 1; j <= i; j++)
    {        
        result++;
    }
}

до:

for (int i = 1; i <= 100; i++)
{
    result += j;
}

Если ваш компилятор действительно умный (например, clang -O2), он скомпилирует его в простой result = 5050;, но такая оптимизация может в конечном итоге привести к на самом деле медленная компиляция (он должен запускать код заранее, чтобы вычислить, каким должно быть значение, если только это не особые примеры, которые заставляют компилятор занимать больше места).

0 голосов
/ 07 апреля 2019

@ wizzwiss34 ответ правильный ... добавив немного больше контекста.В математике это упоминается как конечный ряд , и вы выполняете эту математическую функцию, используя C.

Конечный ряд представляет собой сумму конечного числа членов,Бесконечный ряд имеет бесконечное число слагаемых и верхний предел бесконечности.Этот урок будет иметь дело с конечными сериями.Бесконечные серии будут рассмотрены в учебниках по исчислению.

В этом случае последовательность составляет 100 + 99 + 98 + 97 ... + 1 = 5050

Для общего числаi вы добавляете i-1 каждый раз.

...