Другие языки программирования и технологии

вычислить ряд 1/2+1/3+1/4... с точностью 0,1 в Турбо Паскаль. срочно, пожалуйста помогите!!!

Можно короче, чем у Сергея
const EPS=0.1;
var prev,r,s:real;
var n:integer;
begin
n := 2;
s := 1/n;
prev := 1;
while ABS(s - prev) >= EPS do
begin
prev := s;
n := n+1;
s := s + 1/n;
end;
writeln('summa = ',s);
readln;
end.

Jurii не совсем прав. Дело в том, что 1/11 + 1/12 > 1/10, поэтому эти слагаемые тоже влияют на точность.
Складывать нужно именно до тех пор, пока разница между двумя соседними суммами не станет меньше 0,1, а это как минимум до n = 20 (1/n = 0,05)
ЯК
Яков Катков
92 236
Лучший ответ
Эх, программисты. Ну неужели Вы все не знаете, что гармонический ряд расходится. Эта сумма бесконечна. И не вычислить ее с точностью 0,1 НИКОГДА. Скорее всего мадам перепутала, и имеется ввиду знакопеременный ряд. Вот тогда да.. . Остаток суммы всегда меньше последнего отброшенного члена по модулю.
Вот так проще и короче:
begin
WriteLn('Cумма = ', 1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10:0:3);
end.
Это вся программа!! !

Потому, что 1/10 = 0.1 - это и есть точность!
А 1/11 < 0.1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Каюсь. Слукавил.. .
Провёл недостаточный анализ ;-)
Но мне ни чего не стоит и дописать:
begin
WriteLn('Cумма = ', 1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9+1/10 +
1/11+1/12+1/13+1/14+1/15+1/16+1/17+1/18+1/19+1/20:0:3);
end.

Но моя программа всё равно короче!
Или даже можно вот так:

var N : Byte; S : Real;
begin
S := 0; for N := 2 to 20 do S := S + 1/N; WriteLn('Сумма = ', S:0:3);
end.

Здесь то уже всё учтено!
Это оптимальный вариант.
Slava Mech
Slava Mech
53 356
const
EPS=0.1;
var
prev,r,s:real;
n:integer;
begin
n:=2;
r:=1/n;
s:=r;
repeat
prev:=r;
n:=n+1;
r:=1/n;
s:=s+r;
until abs(prev-r) < EPS;
writeln('summa = ',s);
readln;
end.

Похожие вопросы