Страница 1 из 3

Помогите решить задача ну Pascal

Добавлено: 02 дек 2007, 01:01
BSP
Дана некоторая последовательность C. Найти максимальный номер I, при котором выполнено нижеследующее условие: C1=Ln(1+1!), C2=Ln(1+3!),C3=Ln(1+5!)...
Ci <1.0e+06

Re: Помогите решить задача ну Pascal

Добавлено: 02 дек 2007, 09:47
annihilator
честно говоря я не совсем понял условие, но всё же:
вводи цикл с проверкой условия, декрементируя исходную переменную I , от начального значения 1е+06 до прерывания при выполнении условия. Тогда получишь наибольший номер. А теперь если объяснишь что надо сделать, я тебе код напишу

Re: Помогите решить задача ну Pascal

Добавлено: 03 дек 2007, 12:22
Хыиуду
while ln(1+fact(i))<1000000 do inc(i);
fact - функция, вычисляющая факториал. Писать здесь не буду

Re: Помогите решить задача ну Pascal

Добавлено: 03 дек 2007, 18:19
BSP
annihilator,
Re: честно говоря я не совсем понял условие, но всё же:

Ну вот как я думаю (возможно я ошибаюсь )

Дана последовательность C1=Ln(1+1!), C2=Ln(1+3!),C3=Ln(1+5!)
Мы видим тут факториал 1! 3! 5!(+2) далее будет 7! 9! 11! 13! 15! и.т.д.
Вот например мы подсчитываем C2=Ln(1+3!) если это подсчитать то тут будет число:
1.9459101491e+00
число 1.9459101491e+00 меньше чем 1.0e+06 следовательно I не максимальный номер
далее берем C2=Ln(1+5!) тут тоже число будет меньше чем 1.0e+06 следовательно тоже не подходит.

Короче нужно на экран вывести максимальное число I при C < 1.0e+06

Хыиуду, чегото неполучается ошибка 205 пишит, вот код:
program Factorial;
uses crt;
Function Fact(I: Word): real;
Begin
If I = 1 then Fact:= 1
else Fact:= I * Fact(I-1);
End;
var
i:integer;
begin
i:=1;
while ln(1+fact(i))<1000000 do inc(i);
writeln(i);
readln;
end.

PS: Спасибо огромное!

Re: Помогите решить задача ну Pascal

Добавлено: 03 дек 2007, 20:15
BSP
Эх(( ошибку 205 исправил, теперь появилась ошибка 207, вот тут: while ln(1+fact(i))<1000000 do inc(i); если место 1000000 написать 10 то ошибки не будет а как сдеалть так чтобы и 1000000 помещалась хз :-(

Re: Помогите решить задача ну Pascal

Добавлено: 04 дек 2007, 00:29
BSP
Уфф, вроде сделал, вот код (если что то я сделал не так скажите мне об этом пожалуйста, а если все правильно то спасибо вам :) ):

program MyZada4a;
uses crt;
Function Fact(N: Word): real;
Begin
If N = 1 then
Fact:= 1
else
Fact:= N * Fact(N-1);
End;

var
i:integer;
c:real;
begin
c:= 1;
i:= 1;
repeat
c:=ln(1+fact(i));
i:=i+2;
until c<1.0e+06;
writeln(c);
readln;
end.

Re: Помогите решить задача ну Pascal

Добавлено: 04 дек 2007, 10:02
Serge_Bliznykov
вынужден Вас очень-очень расстроить....
1) решение у вас неверное - потому как until выходить из цикла, когда указанное в нём условие ВЫПОЛНЯЕТСЯ (в точности наоборот от цикла с предусловием While ...), т.е. у вас будет выведено 6.93147180560118E-0001 (=0.69314.... = Ln(1+1!)

2) я вообще не уверен, что задачу можно решить подобным образом ;-((((
дело в том, что решение задачи Ln(1+X!) = 1.0e+06 означает, что
1+X! = 2.718^1000000 я не нашёл калькулятора, которые это бы посчитал... ;-(
значит задачу надо решать либо через арифметику больших чисел, либо вообще по другому - разложить в ряд, например, или попытаться преобразовать, чтобы упростить выражение.... но в лоб вы её не решите - разрядности хранения не только real , но даже Extended не хватает ;-((

Удачи.

Re: Помогите решить задача ну Pascal

Добавлено: 04 дек 2007, 10:17
somewhere
Serge_Bliznykov, истину глаголишь! Но задачу можно решить по частям, разложив ln(X!) как Ln(5!) + ln(6*7*8*9*10) + ln(11*12*13*14*15) + ...
Я считаю что на вычесление I например, единичка не влияет никак, ибо решением задачи будет очень немаленькое Х, не говоря о X!

Re: Помогите решить задача ну Pascal

Добавлено: 04 дек 2007, 14:31
Хыиуду
Есть мнение, что задача не решится стандартными путями. Потому что число X, для которого ln(x)>=1000000 - это exp(1000000). А такое число ни один известный мне язык программирования адекватно отобразить не может. Уже экспонента семисот - это 10^304. Так что, BSP, объявляйте своему преподавателю, что задача имеет решение, но не может быть решена

Re: Помогите решить задача ну Pascal

Добавлено: 04 дек 2007, 15:06
somewhere
Хыиуду, почитай мой пост выше, задача решается и очень просто:

Код: Выделить всё

uses crt;

var
i : Longint;
R : Extended;

begin
clrscr;
i := 1; R := 0;
While R < 1000000 do
        begin
        R := R + Ln(i);
        Writeln('ln(',i,'!) = ', r:12:3);
        i := i + 1;
        end;
end.
Как видим - результат: x = 95535 ))))) очень похоже на 65535
P.S. Единичкой внутри LN принебрег из-за незначимости