Помощь - Поиск - Пользователи - Календарь
Полная версия: Выяснить если число можно представить как суму факториалов.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
DarkWishmaster
вообщем надо выяснить если число может быть сумой из факториалов, если да, то показать на экране эти числа.
Например:
INPUT - 145->
Output:5!+4!+1!=145

var   i,n,s,j,m:integer;                                                      
function F(n:integer):integer;
var i,p:integer;
begin
p:=1;
for i:=1 to n do begin
p:=p*i; end;
F:=p;
end; {Factorial}
begin clrscr;
readln(n);
while m<=n do begin
inc(i);
m:=F(i); j:=i; end; {самый близкий факториал}
while j>0 do begin
j:=j-1;
s:=s+F(j);
if s>n then begin s:=s-F(j); j:=j-1;
end;
end;
if s=n then writeln('YES') else writeln('NO'); readln
end.

Ну вроде бы разобрался как выяснить если можно представить как суму из факториалов, но как вывести на экран?

Вот вариант:

  while m<=n do begin                                                      
║ inc(i);
║ m:=F(i); j:=i; end; {factorial apropiat}
║ while j>1 do begin
║ j:=j-1;
║ s:=s+F(j); l:=s;
║ if s>n then begin x:=x+1; s:=s-F(j); end;
║ if l=s then a[x]:=l;
║ end;
║ if s=n then begin
║ for i:=1 to x do begin
║ write(a[x],'!'); if i<x then write('+'); end;
║ write('=',n); end else writeln('Nu poate');

║ readln;
║ end.

В принципе должен работать, только вот почему то тут (l:=s; ) x получает значение сумы s:=s+F(j). например если n=145, то тут x сразу получает 120 ( 5!)

-TarasBer-
А надо факториалы разных чисел?
А то я единичками набрать могу.

Ну если разными - то очевидно, что раз сумма факториалов от 1 до n-1 меньше n!, то надо просто вычитать максимальный факториал ещё не учтённого числа.
DarkWishmaster
Мне бы решить проблему, почему X получает значение S в начале.
Lapp
Цитата(DarkWishmaster @ 1.02.2011 15:08) *
Мне бы решить проблему, ..

DarkWishmaster, научишься разговаривать с людьми - проблемы станут намного проще. Когда тебе задают вопрос - постарайся заставить себя ответить, даже если он не кажется тебе важным.
DarkWishmaster
Цитата(Lapp @ 2.02.2011 12:59) *

DarkWishmaster, научишься разговаривать с людьми - проблемы станут намного проще. Когда тебе задают вопрос - постарайся заставить себя ответить, даже если он не кажется тебе важным.


Единственый вопрос тут:
А надо факториалы разных чисел? " Да.
А не ответил я потому что это очевидно что можно любое число изоброзить сумой факториалов из 1!, и нет нужды для это выяснить если можно число изоброзить как суму или нет.
Извините.

Пожалуйста, помогите с програмой, где Х получает значение S.
Lapp
Цитата(DarkWishmaster @ 2.02.2011 14:45) *
А не ответил я потому что это очевидно что можно любое число изоброзить сумой факториалов из 1!, и нет нужды для это выяснить если можно число изоброзить как суму или нет.
Извините.
Извинения приняты. Но все же отвечать на вопросы надо..

Цитата
помогите с програмой, где Х получает значение S.
Я посмотрел, но мне стало скучно (особенно при таком прелестном форматировании кода)).. В этой задаче рекурсия напрашивается сама собой. Я набросал решение, посмотри на него. Даю два варианта: один без вывода слагаемых, второй с выводом. Первый - из чисто эстетических побуждений (добавление вывода изрядно портит красоту)).

Без вывода слагаемых:
function F(i: integer): longint;
begin
if i=0 then F:= 1 else F:= i*F(i-1)
end;

function Y(n: longint; k: integer): boolean;
begin
Y:= (n=0) or (k>0) and (Y(n,k-1) or Y(n-F(k),k-1))
end;

var
n,i: longint;

begin
ReadLn(n);
i:= 1;
while F(i+1)<=n do Inc(i);
WriteLn(Y(n,i));
readln
end.


С выводом слагаемых:
function F(i: integer): longint;
begin
if i=0 then F:= 1 else F:= i*F(i-1)
end;

function Y(n: longint; k: integer; s: string): boolean;
var
t: string;
begin
if n=0 then Write(Copy(s,1,Length(s)-2),'= ') else Str(k,t);
Y:= (n=0) or (k>0) and (Y(n,k-1,s) or Y(n-F(k),k-1,t+'! + '+s))
end;

var
n,i: longint;

begin
ReadLn(n);
i:= 1;
while F(i+1)<=n do Inc(i);
if Y(n,i,'') then
WriteLn(n)
else
WriteLn('No factorials sum representation found for ',n);
readln
end.

Если есть вопросы - задавай.

А что касается твоей "проблемы" - вот, держи, так и быть:
var
i,n,s,j,m,l,x: integer;

function F(n:integer):integer;
var
i,p:integer;
begin
p:=1;
for i:=1 to n do begin
p:=p*i;
end;
F:=p;
end; {Factorial}

var
a: array [1..100] of integer;

begin
readln(n);
while m<=n do begin
inc(i);
m:=F(i);
j:=i;
end; {factorial apropiat}
while j>1 do begin
j:=j-1;
s:=s+F(j);
l:=s;
Inc(x);
a[x]:= j;
if s>n then begin
s:=s-F(j);
Dec(x)
end;
end;
if s=n then begin
for i:=1 to x do begin
write(a[i],'!');
if i<x then write('+');
end;
write('=',n);
end
else writeln('Nu poate');
readln;
end.
DarkWishmaster
Lapp, спасибо большое за помощь.
DarkWishmaster
ещё одна проблема, как сделать так в Паскале:
T1:='PLATON';
T1[3:4]:='TR'; {только с 3 по 4 буквы}
T1='PATRON'
вот програма которая должна инверсировать слова из строки: Програмирование Паскал -> Паскал Програмирование

║Program P3;
║Uses Crt;
║var P1,P2,S:string; spatiu,i:integer;
║Begin
║ ClrScr;
║ readln(P1);
║ P2:='';
║ P1:=P1+' ';
║ while P1='' do begin
║ spatiu:=POS(' ',P1);
║ S:=P1[1:spatiu]; {проблемный участок}
║ P2:=S+P2;
║ Delete(P1,1,spatiu);
║end;
║writeln(P2);
║readln;
║end.
Lapp
М
DarkWishmaster, флуд в твоей теме - такой же, как и в других. Начатая тобой тема не есть твоя собственность. Потрудись сделать новую тему для новой задачи.



И, кстати, в то, что ты там написал, я не смог врубиться.. обхясни четче. И НЕ НАДО ЧУЖИХ ПРОГРАММ. Давай условие и свои наработки. На фига нам тут чужой хлам?? ты думаешь это облегчает задачу, что ли? ты ошибаешься.
DarkWishmaster
Lapp,

Я щас изучаю одну книгу по алогоритмам, и там всё написано так что-бы можно было применить для любых языков програмирование.
Но всё, разобрался, в паскале эту функцию выполняет Copy, спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.