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

BSP
Сообщения: 23
Зарегистрирован: 01 дек 2007, 21:28

Дана некоторая последовательность C. Найти максимальный номер I, при котором выполнено нижеследующее условие: C1=Ln(1+1!), C2=Ln(1+3!),C3=Ln(1+5!)...
Ci <1.0e+06
Аватара пользователя
annihilator
Сообщения: 35
Зарегистрирован: 27 ноя 2007, 00:22

честно говоря я не совсем понял условие, но всё же:
вводи цикл с проверкой условия, декрементируя исходную переменную I , от начального значения 1е+06 до прерывания при выполнении условия. Тогда получишь наибольший номер. А теперь если объяснишь что надо сделать, я тебе код напишу
Вот представьте себе: чистое поле - ни кустика, ни деревца, и вдруг из-за угла выезжает танк!
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

while ln(1+fact(i))<1000000 do inc(i);
fact - функция, вычисляющая факториал. Писать здесь не буду
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
BSP
Сообщения: 23
Зарегистрирован: 01 дек 2007, 21:28

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: Спасибо огромное!
BSP
Сообщения: 23
Зарегистрирован: 01 дек 2007, 21:28

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

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

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.
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

вынужден Вас очень-очень расстроить....
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 не хватает ;-((

Удачи.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Serge_Bliznykov, истину глаголишь! Но задачу можно решить по частям, разложив ln(X!) как Ln(5!) + ln(6*7*8*9*10) + ln(11*12*13*14*15) + ...
Я считаю что на вычесление I например, единичка не влияет никак, ибо решением задачи будет очень немаленькое Х, не говоря о X!
It's a long way to the top if you wanna rock'n'roll
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Есть мнение, что задача не решится стандартными путями. Потому что число X, для которого ln(x)>=1000000 - это exp(1000000). А такое число ни один известный мне язык программирования адекватно отобразить не может. Уже экспонента семисот - это 10^304. Так что, BSP, объявляйте своему преподавателю, что задача имеет решение, но не может быть решена
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Хыиуду, почитай мой пост выше, задача решается и очень просто:

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

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 принебрег из-за незначимости
It's a long way to the top if you wanna rock'n'roll
Ответить