Можно короче, чем у Сергея
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)
Другие языки программирования и технологии
вычислить ряд 1/2+1/3+1/4... с точностью 0,1 в Турбо Паскаль. срочно, пожалуйста помогите!!!
Эх, программисты. Ну неужели Вы все не знаете, что гармонический ряд расходится. Эта сумма бесконечна. И не вычислить ее с точностью 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.
Здесь то уже всё учтено!
Это оптимальный вариант.
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.
Здесь то уже всё учтено!
Это оптимальный вариант.
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.
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.
Похожие вопросы
- Напишите задачу на C++. Найти, какая оценка наиболее часто встречалась на ЕГЭ. Входные данные: 1 1 1 2 2 3 1 3 4 5 3.
- кто разбирается в паскале??У мя турбо паскаль 7.0 помогите!!!
- Вычислить произведение n>=2 (n четное) сомножителей y=(2/1)*(2/3)*(4/3)*(4/5)*(6/5)*(6/7)*..
- Как найти сумму цифр пятизначного числа в турбо паскаль? Помогите, пожалуйста!!!
- Какими кодами можно создать txt файл в турбо паскале с текстом? Помогите пожалуйста
- Турбо Паскаль. Объясните пожалуйста
- СИ: "int a[3]={1, 2, 3}, * p=a+1" Чему равно значение выражения "p[0]-2"? И что вообще здесь происходит?
- var k:1..9; напечатать значение переменной k римскими цифрами. в турбо паскаль нужно написать программу
- Подробная установка связки Apache 2.0 + Php 5.1.4 + Mysql Server 4.1.16 под Win32 платформу
- С++ Арифметические действия над числами пронумерованы следующим образом : 1-сложение, 2-вычитание, 3-умножение, 4-дел...