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

Дано вещественное число а . Найти такое наименьшее m, при котором: 1+ 1/2+1/3+...+ 1/m>a
Гость
Ответ(ы) на вопрос:
Гость
// 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);   Writeln('m=',m) end. Тестовое решение: a= 5 m=83 Указанный ряд - это известный в математике расходящийся гармонический ряд. Его приближенное значение суммы можно определить по формуле Эйлера: [latex]\displaystyle S(m)=\sum_{i=1}^m \frac{1}{i} \approx \ln(m)+C, \quad C\approx 0.577\ 215\ 664\ 902[/latex] Нам требуется определить m, для которого S(m)>a, тогда [latex]\displayvalue \ln(m)+C\ \textgreater \ a; \ ln(m)\ \textgreater \ a-C \to m\ \textgreater \ e^{a-C}[/latex] Будем искать 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     while SHarm(m)<=a do Inc(m);     Writeln('m=',m)     end   else begin     var s:real:=Int(exp(a-C));     if a<10 then begin       m:=Trunc(s);       while SHarm(m)<=a do Inc(m);       Writeln('m=',m)       end     else Writeln('m=',s)     end end. В этом случае можно проводить оценочный расчет для больших значений а: a= 200 m=4.05709150011779E+86
Не нашли ответ?
Ответить на вопрос
Похожие вопросы