• Авторизация


Помогите с Pascal'ем 28-10-2006 23:38 к комментариям - к полной версии - понравилось!


Хелп, не могу найти ошибку.
Задание такое:
Найти рекуррентную формулу, используя которую для заданного с клавиатуры значения m и x (2>x>1), найдите сумму S:
S={*тут следует значок суммы от n=1 до m*}(-1)n*(x-1)2n/(2n)!!
Я делала
program summa;
var f, m, n, k, i : integer;
x, s : real;
begin
repeat
writeln('vvedi m,x');
readln(m);
readln(x);
until ((x>1) and (x<2));
s:=-(x-1)/2;
writeln('s1=',s);

for n:=1 to m do
begin
f:=1;
k:=2*n;
for i:=1 to k do begin
f:=f*i;
end;
writeln(f);

if (n mod 2)=0 then s:=s+(exp(2*n*ln(x-1)))/f
else s:=s-(exp(2*n*ln(x-1)))/f;

end;
writeln('s=', s:10:4);
readln;
end.

Но во-1, даже при маленьких m, факториал начинает зашкаливать и превращаться в ноль. А во-2, СУММА ВСЁ ВРЕМЯ ПОЛУЧАЕТСЯ ОДИНАКОВАЯ!
Что делать? :(
Понимаю, что наверна это жутко просто, но я тупость невиданная, ибо после гумманитарного класса без информатики ВААПЩЕ поступила в техн. фуз на программирование :)
Хелп!Мне в понедельник сдавать это и мноооогое другое...

Настроение сейчас - мозг вышел погулять
вверх^ к полной версии понравилось! в evernote
Комментарии (16):
Для переменной, которая используется значение факториала лучше определять тип вещественный (real), т.к. диаппазон integer где-то от -32000 до 32000 (точно не помню, но это и не важно), даже 8!=40320



TLС v.0.7.1
Wethril_Haldar 29-10-2006-01:19 удалить
1-е - двойной факториал - это не факториал факториала а факториал касающийся перемножения только нечетных членов последовательности
1*3*5*...*(2n-3)*(2n-1)

2-e факториал можно оформить как рекуррентную(т.е. вызывающую саму себя) функцию. так будет работать побыстрей, и красиво это , в конце-концов)))
Dim_K 29-10-2006-08:38 удалить
Что я могу сказать... Несколько неточностей:
1). Вы написали совсем не рекуррентную формулу. Что такое рекуррентная формула? Вот, например, числа Фибоначчи x[1]=1, x[2]=1, x[i]=x[i-2]+x[i-1], i больше 2, то есть следующее слагаемое вычисляется при помощи предыдущих.
2). Выше уже было сказано про двойной факториал, может там все-таки обычный?


program ex;
var m, n, i : integer;
x, s_pred,s_next,sum : real;


begin
repeat
writeln('vvedi m,x');
readln(m);
readln(x);
until ((x>1) and (x<2) and (m>0));
sum:=-(x-1)*(x-1)/2;
s_pred:=sum;
if m>1 then
for n:=2 to m do
begin
s_next:=-s_pred*(x-1)*(x-1)/(2*n); {если нужен обычный факториал а не двойной то делить не на 2n а на n}
sum:=sum+s_next;
s_pred:=s_next;
end; { for n:=2 to m}
writeln('s=', sum:10:4);
readln;
end.
При рекурретных вычислениях не возникает необходимости заводить пременный для "больших" вычислений (факториал), в сумме они обычно погашаются другими множетелями или слагаемыми

LI 5.09.15
Dim_K 29-10-2006-08:47 удалить
Wethril_Haldar, мне кажется двойной факториал вычисляется в зависимости от того, четное ли число стоит под знаком двойного факториала или нет. Если четное то это произведение всех четных чисел больше нуля и меньше числа под знаком, если нечетное, соответственно, произведение нечентных.
Wethril_Haldar, спасибо))Про двойной факториал я в курсе, просто мне и с обычным было не разобраться...Там по любому произведение чётных получится, ибо 2n это уж наверна чётное число...)))
Никнахуйненужен, а я и риал делала переменную под факториал, я просто столько уже исправляла, что все не все исправляения сохранила.Всё равно не работало))))Но за совет спасибо))
Dim_K, спасибо большое! Про рекуррентную формулу-вот для других вариантов я посмотрела задачи, там я смогла сделать, тоже через пред/след значение и постом передавая эти значения между переменными. А тут мне как-то не придумать было. Спасибо ещё раз, щас буду разбираться))
кроме integer можно использывать longint (-2 000 000;2 000 000) или наконец задать интервалом: 0..9999999
если двойной факториал - это факториал от нечетных то тогда вроди так:
code:

program summa;
type my_type=1..999999999;
var j,m: integer;
x,sum: real;
function st(a:real;n:byte):real;
var s:real;
i:byte;
begin
s:=1;
for i:= 1 to n do
s:=s*a;
st:=s;
end;
function fak(n:byte):my_type;
begin
if n=1 then fak:=1
else fak:=n*fak(n-2);
end;
begin
repeat
writeln('vvedi m,x');
readln(m,x);
until ((x>1) and (x<2));
sum:=0;
for j:=1 to m do
begin
sum:=sum+st(-1,j)*st(x-1,2*j)/fak(2*j-1);
end;
writeln('summa=', sum:10:4);
readln;
end.

Гаврик_из_Кащенко, если двойной факториал-это ИЛИ от чётных, ИЛИ от нечётных, смотря какое число))
И мне нельзя через функции делать, мне надо циклом =(
Dim_K 29-10-2006-14:27 удалить
Вы предложили не рекуррентый метод вычисления суммы

LI 5.09.15
Исходное сообщение Хренотень: Гаврик_из_Кащенко, если двойной факториал-это ИЛИ от чётных, ИЛИ от нечётных, смотря какое число))
И мне нельзя через функции делать, мне надо циклом =(


Какая сволочь это сказала? ну ладно, можно и подправить))

LI 5.09.15
Исходное сообщение Dim_K: Вы предложили не рекуррентый метод вычисления суммы


ЗАТО ЭТО РАБОТАЕТ

LI 5.09.15
Dim_K 29-10-2006-14:46 удалить
А кто сказал, что у меня не работает?

LI 5.09.15
Исходное сообщение Dim_K: А кто сказал, что у меня не работает?


Никто ничего не говорил

LI 5.09.15
Гаврик_из_Кащенко, это всё универ...))никакой свободы выбора, пхахахаха)))Зато может научусь чему путному ;)
Dim_K, я попробовала как вы сказали, у меня сначала всё равно одинаковая сумма получалась, потом убрала формат вывода или как это обозвать...В общем, :10:4. Тогда видно, что сумма разная, но там просто ооочень маленькая разница получается..Так и должно быть?
Исходное сообщение Хренотень: Гаврик_из_Кащенко, это всё универ...))никакой свободы выбора, пхахахаха)))Зато может научусь чему путному ;)
Dim_K, я попробовала как вы сказали, у меня сначала всё равно одинаковая сумма получалась, потом убрала формат вывода или как это обозвать...В общем, :10:4. Тогда видно, что сумма разная, но там просто ооочень маленькая разница получается..Так и должно быть?


Наверное
В колонках играет: Город 312 - Останусь

LI 5.09.15
Dim_K 29-10-2006-18:48 удалить
Исходное сообщение
Dim_K, я попробовала как вы сказали, у меня сначала всё равно одинаковая сумма получалась, потом убрала формат вывода или как это обозвать...В общем, :10:4. Тогда видно, что сумма разная, но там просто ооочень маленькая разница получается..Так и должно быть?

Да, этот ряд довольно быстро сходится (слагаемые с нормером n больше 3 уже имею порядок 10 в минус 3), все нормально

LI 5.09.15


Комментарии (16): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Помогите с Pascal'ем | community_coding - Сообщество программистов | Лента друзей community_coding / Полная версия Добавить в друзья Страницы: раньше»