Дано вещественное число а . Найти такое наименьшее m, при котором: 1+ 1/2+1/3+...+ 1/m>a

0 голосов
67 просмотров

Дано вещественное число а . Найти такое наименьшее m, при котором:
1+ 1/2+1/3+...+ 1/m>a


Информатика (70 баллов) | 67 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

// PascalABC.NET 3.0, сборка 1160 от 05.02.2016
function SHarm(m:integer):real:=Range(1,m).Select(x->1/x).Sum;

begin
  var a:=ReadReal('a=');
  var m:=1;
  while SHarm(m)<=a do Inc(m);<br>  Writeln('m=',m)
end.

Тестовое решение:
a= 5
m=83

Указанный ряд - это известный в математике расходящийся гармонический ряд. Его приближенное значение суммы можно определить по формуле Эйлера:
\displaystyle S(m)=\sum_{i=1}^m \frac{1}{i} \approx \ln(m)+C, \quad C\approx 0.577\ 215\ 664\ 902
Нам требуется определить m, для которого S(m)>a, тогда
\displayvalue \ln(m)+C\ \textgreater \ a; \ ln(m)\ \textgreater \ a-C \to m\ \textgreater \ e^{a-C}
Будем искать m, отбрасывая дробную часть полученного результата, а потом делать уточнение путем непосредственного вычисления сумм.

// PascalABC.NET 3.0, сборка 1160 от 05.02.2016

const C=0.577215664902; // Постоянная Эйлера-Маскерони

function SHarm(m:integer):real:=Range(1,m).Select(x->1/x).Sum;

begin
  var a:=ReadReal('a=');
  var m:=1;
  if a<=3 then begin<br>    while SHarm(m)<=a do Inc(m);<br>    Writeln('m=',m)
    end
  else begin
    var s:real:=Int(exp(a-C));
    if a<10 then begin<br>      m:=Trunc(s);
      while SHarm(m)<=a do Inc(m);<br>      Writeln('m=',m)
      end
    else Writeln('m=',s)
    end
end.

В этом случае можно проводить оценочный расчет для больших значений а:

a= 200
m=4.05709150011779E+86



(142k баллов)
0

А на больших числах программа нормально работает ?

0

На больших - это на каких? Проще всего её просто запустить и посмотреть, но все же - что Вы "большими числами" зовёте?

0

У меня другой паскаль, поэтому не могу запустить. Пусть числа > 50

0

Если m превышает хотя бы несколько сотен, то проще это все не считать, а воспользоваться приблизительным значением суммы гармонического ряда, которое дал Л.Эйлер. Она равна ln(m)+C, где С примерно рано 0.577216 (постоянная Эйлера-Маскерони). Потому что для a=10 уже имеем m=12367

0

Дело в том, что гармонический ряд - расходящийся и получить для очень больших m точное решение Вашей задачи за разумное вычислительное время не получится, можно только дать оценку, а затем её уточнять.

0

Что до Паскаля - скачайте этот с официального сайта.

0

Но то, о чем я написал выше - это далеко за рамками школы.

0

Понял Вас. Большое спасибо за пояснение