Консультация № 161916
03.03.2009, 16:13
0.00 руб.
0 7 1
Доброго времени суток)
Тут вот возникла такая проблема:
Пусть n-натуральное число,а n!! (!-факториал) означает 1*3*5*...*n для нечетного n и 284*6*...*n для четного n.Для заданного n вычислить ((-1)в степени n+1) * n!!

Обсуждение

Неизвестный
03.03.2009, 16:16
общий
Помогите пожалуйста написать работающую программу...Я,думаю идея примерно такая:
program asasd;
uses crt;
var
i,res,n,asd : integer;
begin
writeln('enter n');
read(n);
res :=1;
if n mod 2 = 0 then
begin
res := -1;
asd := 2;
end
else
asd := 1;
while ( asd <= n) do
begin
res := res*asd; inc(asd,2);
end;
writeln('res= ',res);readkey;
end.


это,вроде ,можно упростить
"if n mod 2 = 0 then
begin
res := -1;
asd := 2;
end
else
asd := 1;" но вот как - не знаю, самому эта конструкция не нравица(

Помогите чем можете)
Заранее спасибо.
давно
Старший Модератор
31795
6196
03.03.2009, 16:29
общий
Павленко Антон Михайлович:
У Вас какой компилятор: ТР или PascalABC?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
03.03.2009, 16:42
общий
Turbo Pascal 7й...если Я так понял вопрос
Неизвестный
03.03.2009, 16:48
общий
это ответ
Здравствуйте, Павленко Антон Михайлович!
Как вам предлагаемый в приложении вариант? Сразу скажу, что факториал растет очень быстро, поэтому var res:longint, но даже в этом случае при N>19 программа не работает.
И еще совет по поводу множителя ((-1)в степени n+1)- он будет равен -1 для всех четных n и 1 для всех нечетных. Поэтому он учитывается в самом конце расчетов:mod 2 = 0 then res:=-res;
Все.
Рад был помочь


Приложение:
uses crt;
var res:longint;
asd,n:integer;
BEGIN
clrscr;
write ('Vvedite N=');
readln(n);
asd:=n mod 2+2;
res:=1;
while asd<=n do
begin
res:=res*asd;
inc(asd,2);
end;
if n mod 2 = 0 then res:=-res;
writeln ('otvet: ',res);
readln;
END.
давно
Старший Модератор
31795
6196
03.03.2009, 16:53
общий
Павленко Антон Михайлович:
Тогда всё упрощаем, полностью:
res := 2*ord(odd(n))-1;
asd := 2-ord(odd(n));
функция ord(odd(n)) дает 1 если n - нечетно и 0 если - четно
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
03.03.2009, 16:53
общий
И еще. В принципе было бы неплохо добавить контроль неотрицательности вводимого N, заменив
clrscr;
write ('Vvedite N=');
readln(n);

на:

repeat
clrscr;
write ('Vvedite N=');
readln(n);
until n>0

Но это уже лирика :)

Да, и (-1) в степени n+1 лучше учесть не в конце (if n mod 2= 0 then r:=-res), а в самом начале, заменив res := 1 на if n mod 2 = 0 then res:=-1 else res:=1;
Неизвестный
03.03.2009, 17:15
общий
Мне бы ваши мозги))))
Спасибо ОГРОМНОЕ!!!
Форма ответа