2001-gre-vs-practice.pdf/Q14 — различия между версиями

Материал из DISCOPAL
Перейти к: навигация, поиск
 
Строка 1: Строка 1:
{{reserve-task|[[Участник:Tiniakov.ad|Tiniakov.ad]] 14:24, 20 декабря 2024 (UTC)}}
 
 
 
== Вопрос: Q14-e5724f ==
 
== Вопрос: Q14-e5724f ==
  
Строка 45: Строка 43:
 
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.
 
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)}}
 
+
{{checkme|[[Участник:Tiniakov.ad|Tiniakov.ad]] 14:41, 20 декабря 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.