Предмет: Информатика,
автор: Фуфап
Дано вещественное число а . Найти такое наименьшее m, при котором:
1+ 1/2+1/3+...+ 1/m>a
Ответы
Автор ответа:
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);
Writeln('m=',m)
end.
Тестовое решение:
a= 5
m=83
Указанный ряд - это известный в математике расходящийся гармонический ряд. Его приближенное значение суммы можно определить по формуле Эйлера:
Нам требуется определить m, для которого S(m)>a, тогда
Будем искать 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
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
Указанный ряд - это известный в математике расходящийся гармонический ряд. Его приближенное значение суммы можно определить по формуле Эйлера:
Нам требуется определить m, для которого S(m)>a, тогда
Будем искать 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
Автор ответа:
0
Если m превышает хотя бы несколько сотен, то проще это все не считать, а воспользоваться приблизительным значением суммы гармонического ряда, которое дал Л.Эйлер. Она равна ln(m)+C, где С примерно рано 0.577216 (постоянная Эйлера-Маскерони). Потому что для a=10 уже имеем m=12367
Автор ответа:
0
Дело в том, что гармонический ряд - расходящийся и получить для очень больших m точное решение Вашей задачи за разумное вычислительное время не получится, можно только дать оценку, а затем её уточнять.
Автор ответа:
0
Что до Паскаля - скачайте этот с официального сайта.
Автор ответа:
0
Но то, о чем я написал выше - это далеко за рамками школы.
Автор ответа:
0
Понял Вас. Большое спасибо за пояснение
Похожие вопросы
Предмет: География,
автор: kristinablinuk
Предмет: Математика,
автор: Аноним
Предмет: Английский язык,
автор: jaishshaysggwgsv
Предмет: Математика,
автор: Dea43
Предмет: Литература,
автор: Okcana88