// 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.
<u><em>Тестовое решение:</em></u>a= 5
m=83
Указанный ряд - это известный в математике расходящийся <u>гармонический</u> ряд. Его приближенное значение суммы можно определить по формуле Эйлера:
![\displaystyle S(m)=\sum_{i=1}^m \frac{1}{i} \approx \ln(m)+C, \quad C\approx 0.577\ 215\ 664\ 902](https://tex.z-dn.net/?f=%5Cdisplaystyle+S%28m%29%3D%5Csum_%7Bi%3D1%7D%5Em+%5Cfrac%7B1%7D%7Bi%7D+%5Capprox+%5Cln%28m%29%2BC%2C+%5Cquad+C%5Capprox+0.577%5C+215%5C+664%5C+902)
Нам требуется определить m, для которого S(m)>a, тогда
![\displayvalue \ln(m)+C\ \textgreater \ a; \ ln(m)\ \textgreater \ a-C \to m\ \textgreater \ e^{a-C}](https://tex.z-dn.net/?f=%5Cdisplayvalue+%5Cln%28m%29%2BC%5C+%5Ctextgreater+%5C+a%3B+%5C+ln%28m%29%5C+%5Ctextgreater+%5C+a-C+%5Cto+m%5C+%5Ctextgreater+%5C+e%5E%7Ba-C%7D)
Будем искать 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