2001-gre-vs-practice.pdf/Q14 — различия между версиями
StasFomin (обсуждение | вклад) |
|||
(не показана 1 промежуточная версия 1 участника) | |||
Строка 1: | Строка 1: | ||
− | |||
− | |||
== Вопрос: Q14-e5724f == | == Вопрос: Q14-e5724f == | ||
− | + | Рассмотрим следующую программу на языке C | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | <code-c> | |
− | + | #include <stdio.h> | |
− | + | void main() | |
− | + | { | |
+ | float sum = 0.0, j = 1.0, i = 2.0; | ||
+ | while (i / j > 0.001) | ||
+ | { | ||
+ | j = j + j; | ||
+ | sum = sum + i / j; | ||
+ | printf("%f\n", sum); | ||
+ | } | ||
+ | } | ||
+ | </code-c> | ||
− | + | Какое целое число лучше всего приближает последнее напечатанное программой число? | |
− | + | ||
=== Ответы === | === Ответы === | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | * 0; | ||
+ | * 1; | ||
+ | * Правильный ответ: 2; | ||
+ | * 3; | ||
+ | * 4. | ||
=== Объяснение === | === Объяснение === | ||
− | + | {{cstest-source|2001-gre-vs-practice.pdf|19|14}} | |
− | {{cstest-source|2001-gre-vs-practice.pdf| | + | |
− | + | ||
− | + | ||
− | + | Данная программа в цикле while проверяет условие i / j > 0.001. Если условие выполнено, она увеличивает j вдвое, увеличивает сумму на i/j и выводит на новой строке новую сумму. | |
− | + | Изначально sum == 0.0, j == 1.0, i == 2.0. Значит в цикле имеем следующую цепочку: | |
− | + | * 2/1 > 0.001? true -> j *= 2, sum += i/j | |
+ | * 2/2 > 0.001? true -> j *= 2, sum += i/j | ||
+ | * 2/4 > 0.001? true -> j *= 2, sum += i/j | ||
+ | * 2/8 > 0.001? true -> j *= 2, sum += i/j | ||
+ | ... | ||
+ | * 2/2^11 > 0.001? false. | ||
− | </ | + | Итого получаем сумму геометрической прогрессии: |
+ | 2/2 + 2/4 + 2/8 + ... + 2/2^11 == 1 + 1/2 + 1/4 + ... + 1/2^10. Известный факт, что сумма обратных степеней двойки в пределе равна 1 (<m>\lim_{n \to \infty}\sum_{k=1}^N 1/2^k = 1</m>). Следовательно, последнее число точно не больше 2. Рассмотрим сумму еще раз: она начинается со слагаемых 1 + 1/2 + 1/4 + ... Это уже больше, чем 1.5, следовательно последняя сумма точно больше 1.5, а значит лучшим приближением для последней суммы будет 2. | ||
− | {{question-ok|}} | + | {{question-ok|[[Участник:StasFomin|StasFomin]] 08:48, 21 декабря 2024 (UTC)}} |
− | [[Категория: | + | [[Категория:Циклы]] |
Текущая версия на 08:48, 21 декабря 2024
Вопрос: Q14-e5724f
Рассмотрим следующую программу на языке C
#include <stdio.h> void main() { float sum = 0.0, j = 1.0, i = 2.0; while (i / j > 0.001) { j = j + j; sum = sum + i / j; printf("%f\n", sum); } }
Какое целое число лучше всего приближает последнее напечатанное программой число?
Ответы
- 0;
- 1;
- Правильный ответ: 2;
- 3;
- 4.
Объяснение
Исходники — вопрос 14 на 19 странице книги «2001-gre-vs-practice.pdf»
Данная программа в цикле while проверяет условие i / j > 0.001. Если условие выполнено, она увеличивает j вдвое, увеличивает сумму на i/j и выводит на новой строке новую сумму. Изначально sum == 0.0, j == 1.0, i == 2.0. Значит в цикле имеем следующую цепочку:
- 2/1 > 0.001? true -> j *= 2, sum += i/j
- 2/2 > 0.001? true -> j *= 2, sum += i/j
- 2/4 > 0.001? true -> j *= 2, sum += i/j
- 2/8 > 0.001? true -> j *= 2, sum += i/j
...
- 2/2^11 > 0.001? false.
Итого получаем сумму геометрической прогрессии: 2/2 + 2/4 + 2/8 + ... + 2/2^11 == 1 + 1/2 + 1/4 + ... + 1/2^10. Известный факт, что сумма обратных степеней двойки в пределе равна 1 (). Следовательно, последнее число точно не больше 2. Рассмотрим сумму еще раз: она начинается со слагаемых 1 + 1/2 + 1/4 + ... Это уже больше, чем 1.5, следовательно последняя сумма точно больше 1.5, а значит лучшим приближением для последней суммы будет 2.