begin clrscr; repeat Write('Выберите фигуру (1-квадрат, 2-прямоугольник)'); Readln(n);
case n of 1: begin write('Сторона квадрата='); readln(a); Write('S=', a * a); end; 2: begin write('Стороны прямоугольника='); readln(b, a); Write('S=', b * a); end; else exit; end; until false; end.
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.
В этом случае можно проводить оценочный расчет для больших значений а:
var
b, a: real;
n: integer;
begin
clrscr;
repeat
Write('Выберите фигуру (1-квадрат, 2-прямоугольник)');
Readln(n);
case n of
1:
begin
write('Сторона квадрата=');
readln(a);
Write('S=', a * a);
end;
2:
begin
write('Стороны прямоугольника=');
readln(b, a);
Write('S=', b * a);
end;
else exit;
end;
until false;
end.
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