IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Выяснить если число можно представить как суму факториалов.
сообщение
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


вообщем надо выяснить если число может быть сумой из факториалов, если да, то показать на экране эти числа.
Например:
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!)



Сообщение отредактировано: DarkWishmaster -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

Ну если разными - то очевидно, что раз сумма факториалов от 1 до n-1 меньше n!, то надо просто вычитать максимальный факториал ещё не учтённого числа.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


Мне бы решить проблему, почему X получает значение S в начале.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(DarkWishmaster @ 1.02.2011 15:08) *
Мне бы решить проблему, ..

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


Цитата(Lapp @ 2.02.2011 12:59) *

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


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

Пожалуйста, помогите с програмой, где Х получает значение S.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(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.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


Lapp, спасибо большое за помощь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


ещё одна проблема, как сделать так в Паскале:
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.


Сообщение отредактировано: DarkWishmaster -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


М
DarkWishmaster, флуд в твоей теме - такой же, как и в других. Начатая тобой тема не есть твоя собственность. Потрудись сделать новую тему для новой задачи.



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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Бывалый
***

Группа: Пользователи
Сообщений: 168
Пол: Мужской

Репутация: -  3  +


Lapp,

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 18.05.2024 11:10
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name