Помогите решить задача ну Pascal
Дана некоторая последовательность C. Найти максимальный номер I, при котором выполнено нижеследующее условие: C1=Ln(1+1!), C2=Ln(1+3!),C3=Ln(1+5!)...
Ci <1.0e+06
Ci <1.0e+06
- annihilator
- Сообщения: 35
- Зарегистрирован: 27 ноя 2007, 00:22
честно говоря я не совсем понял условие, но всё же:
вводи цикл с проверкой условия, декрементируя исходную переменную I , от начального значения 1е+06 до прерывания при выполнении условия. Тогда получишь наибольший номер. А теперь если объяснишь что надо сделать, я тебе код напишу
вводи цикл с проверкой условия, декрементируя исходную переменную I , от начального значения 1е+06 до прерывания при выполнении условия. Тогда получишь наибольший номер. А теперь если объяснишь что надо сделать, я тебе код напишу
Вот представьте себе: чистое поле - ни кустика, ни деревца, и вдруг из-за угла выезжает танк!
while ln(1+fact(i))<1000000 do inc(i);
fact - функция, вычисляющая факториал. Писать здесь не буду
fact - функция, вычисляющая факториал. Писать здесь не буду
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
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: честно говоря я не совсем понял условие, но всё же:
Ну вот как я думаю (возможно я ошибаюсь )
Дана последовательность 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: Спасибо огромное!
Эх(( ошибку 205 исправил, теперь появилась ошибка 207, вот тут: while ln(1+fact(i))<1000000 do inc(i); если место 1000000 написать 10 то ошибки не будет а как сдеалть так чтобы и 1000000 помещалась хз :-(
Уфф, вроде сделал, вот код (если что то я сделал не так скажите мне об этом пожалуйста, а если все правильно то спасибо вам
):
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.

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.
-
- Сообщения: 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 не хватает ;-((
Удачи.
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 не хватает ;-((
Удачи.
Serge_Bliznykov, истину глаголишь! Но задачу можно решить по частям, разложив ln(X!) как Ln(5!) + ln(6*7*8*9*10) + ln(11*12*13*14*15) + ...
Я считаю что на вычесление I например, единичка не влияет никак, ибо решением задачи будет очень немаленькое Х, не говоря о X!
Я считаю что на вычесление I например, единичка не влияет никак, ибо решением задачи будет очень немаленькое Х, не говоря о X!
It's a long way to the top if you wanna rock'n'roll
Есть мнение, что задача не решится стандартными путями. Потому что число X, для которого ln(x)>=1000000 - это exp(1000000). А такое число ни один известный мне язык программирования адекватно отобразить не может. Уже экспонента семисот - это 10^304. Так что, BSP, объявляйте своему преподавателю, что задача имеет решение, но не может быть решена
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Хыиуду, почитай мой пост выше, задача решается и очень просто:
Как видим - результат: x = 95535 ))))) очень похоже на 65535
P.S. Единичкой внутри LN принебрег из-за незначимости
Код: Выделить всё
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.
P.S. Единичкой внутри LN принебрег из-за незначимости
It's a long way to the top if you wanna rock'n'roll