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

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

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

> Выяснить если число можно представить как суму факториалов.
DarkWishmaster
сообщение 31.01.2011 19:37
Сообщение #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 - 31.01.2011 20:25
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 9)
-TarasBer-
сообщение 31.01.2011 21:02
Сообщение #2


Гость






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

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


Бывалый
***

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

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


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


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

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

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


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

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


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


Бывалый
***

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

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


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

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


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

Пожалуйста, помогите с програмой, где Х получает значение S.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.02.2011 8:33
Сообщение #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 
 К началу страницы 
+ Ответить 
DarkWishmaster
сообщение 3.02.2011 15:37
Сообщение #7


Бывалый
***

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

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


Lapp, спасибо большое за помощь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
DarkWishmaster
сообщение 4.02.2011 19:16
Сообщение #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 - 4.02.2011 20:03
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 5.02.2011 4:49
Сообщение #9


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

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

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


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



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


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


Бывалый
***

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

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


Lapp,

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

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

 



- Текстовая версия 20.07.2025 18:18
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"