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

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

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

 
 Ответить  Открыть новую тему 
> Разложение на слагаемые
Unconnected
сообщение 5.08.2010 1:07
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

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


Привет всем.

Точно помню, что такое было на форуме, но поиск по всяким сочетаниям ничего не дал( Нужно вывести все возможные разложения числа N на слагаемые, без повторений (3+2 и 2+3 - повтор). Я сделал рекурсией разложение на слагаемые, но с повторениями. Как их избежать, ума не приложу.

{$APPTYPE CONSOLE}

var n:byte;
m:array[1..40] of byte;

Procedure rec(k,l:integer);
var i:integer;
begin
if (k=n) and (l>1) then begin
for i:=1 to l-1 do write(m[i],'+');
writeln(m[l]);
end else begin
for i:=1 to n do begin
if k+i<=n then begin
m[l+1]:=i;
rec(k+i,l+1);
end else break;
end;
end;
end;

begin
fillchar(m,40*sizeof(byte),0);
assign(input,'input.txt');
read(n);
assign(output,'output.txt');
rec(0,0);
end.



N<=40, на 40 этот код оччень долго работает, я не дождался. Наверное, надо отсекать повторы ещё при разложении.

Сообщение отредактировано: Unconnected - 5.08.2010 1:38


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
sheka
сообщение 5.08.2010 1:22
Сообщение #2


Я.
****

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

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


По моему, очень легко. Сейчас разбираться не могу - спать охота smile.gif
Надо раскладывать так, чтобы следующие были меньше предыдущего.
Т. е., например, так:
передаешь процедуре само число. допустим 5.
пусть процедура его раскладывает на 4 и 1.
потом переходишь к меньшему, к единице. она не раскладывается - возврат.
3 2
опять переходишь к меньшему и раскладываешь его. получается 3 | 1 | 1.
опять к меньшему. оно равно 1, поэтому возврат, возврат.
вернулись к 3ке.
2 | 2 | 1
2 | 1 | 1 | 1
1 | 1 | 1 | 1 | 1
Если не сделаешь - завтра попробую

Сообщение отредактировано: sheka - 5.08.2010 1:40
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.08.2010 1:43
Сообщение #3


Гость






Цитата
но поиск по всяким сочетаниям ничего не дал

"+разложе* +слагаем*" = чудо!!! -> Разложение числа smile.gif
 К началу страницы 
+ Ответить 
Unconnected
сообщение 5.08.2010 14:23
Сообщение #4


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

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


sheka, как я понял, с твоим способом всё равно повторы будут..

Блин, я так же искал, по этому сочетанию и со звёздочками, но без плюсов)


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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