Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2011, 22:07   #1
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию Разбиение чисел на слагаемые

Всех с праздником, недавно написал не большую программу, для разбивания числа, на слагаемые, как сделать чтоб не было комбинаций с одинаковыми слагаемыми, стоящими в разном порядке, можно конечно создать массив и хранить в нем все комбинации которые уже были, но может есть другой вариант?
Код:
/*m число, n номер слагаемого, sum сумма уже подобранных слагаемых, parts массив где хранятся слагаемые, end индекс  последнего элемента*/
void IntToParts(int m, int n, int sum, int* parts, int end)
{
	if(n<end)
	{
/*end-n число оставшихся слагаемых слагаемое - натуральное число*/
		for(int i=1; i<=m-(end-n+sum); ++i)
		{
			parts[n]=i;
			IntToParts(m, n+1, sum+i, parts, end);
		}
	}
	else
	{
/*если элемент последний пихаем в него все что осталось*/
			parts[n]=m-sum;
			std::cout<<parts[0];
			for(int j=1; j<=end; ++j)
				std::cout<<'+'<<parts[j];
			std::cout<<'='<<m<<std::endl;
	}
}
ololo-schoolboy вне форума Ответить с цитированием
Старый 24.02.2011, 13:06   #2
Ru_DoLF
Ubuntu 10.04
Пользователь
 
Аватар для Ru_DoLF
 
Регистрация: 15.07.2010
Сообщений: 51
По умолчанию

Цитата:
но может есть другой вариант?
есть
Код:
#include <iostream>

using namespace std;

int main()
{

	int n;

	cin >> n;

	for (int i = 0; i <= n/2; ++i)
		cout << i << " + " << n - i << endl;

	return 0;

}
Язык образует среду мышления и формирует представление о том, о чем мы думаем (Б. Л. Уорф)
Ru_DoLF вне форума Ответить с цитированием
Старый 24.02.2011, 22:12   #3
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

ну это я и так знаю, тока не факт что end+1==2

вот думаю что делать с массивом для начала узнать какого размера он будет мб есть формулы какие-то?
ololo-schoolboy вне форума Ответить с цитированием
Старый 24.02.2011, 23:38   #4
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Используй std::vector же
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 26.02.2011, 17:47   #5
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

Цитата:
Используй std::vector же
не принципиально.

написал функцию для добавления элемента в массив, ни как не могу отладить, выдает полный бред

Код:
/*combinations массив с комбинациями, combCount индекс свободного элемента, nowCombination отсортированный от меньшего к большему массив, size размер массива nowCombination и число колонок в массиве combinations*/
void addCombination(int** combinations, int combCount, int* nowCombination, int size)
{
	memcpy(combinations[combCount], nowCombination, sizeof(int)*size);
	int top = 0;//верхняя граница
	int lower = combCount-1;//нижняя граница
	for(int i=0, j; i<size; ++i)//i столбец по которому сортирую
	{
			int* x = new int[size];
			memcpy(x, combinations[lower+1], sizeof(int)*size);
			/*сортировка вставками*/
			for (j=lower; j>=top && combinations[j][i] > x[i]; j--)
				memcpy(combinations[j+1], combinations[j], sizeof(int)*size);
			memcpy(combinations[j+1], x, sizeof(int)*size);
			delete[] x;
			if(j>=0 && combinations[j][i]==combinations[j+1][i])/*если перед тем что мы вставили что-нибудь есть и это что-то равно тому что мы вставили в i-том столбце*/
			{
				lower = j;
				top = j;
				while(j>=0 && combinations[j][i]==combinations[lower+1][i]) /*самая верхняя строка где i-тый столбец равен i-тому столбцу того что мы вставляем*/
					top =j--;
			}
			else /*если нет элементов с идентичным значением в i-том столбце сортировать по другим столбцам не с чем*/
				break;
	}
}
заранее из извиняюсь за не читабельность, я в курсе что есть всякая хрень в коде типа new int[size] можно было каждый раз не выделять и т.д. потом это подправлю... не понятно почему он все перепутывает
ololo-schoolboy вне форума Ответить с цитированием
Старый 26.02.2011, 19:57   #6
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

сори за тупизну насчет размера разобрался, осталось отсортировать
ololo-schoolboy вне форума Ответить с цитированием
Старый 26.02.2011, 20:09   #7
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

сортируй с помощью std::sort
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 26.02.2011, 21:20   #8
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

он не подойдет у меня все уже отсортировано нужно только вставить еще одну комбинацию в нужное место
ololo-schoolboy вне форума Ответить с цитированием
Старый 26.02.2011, 21:38   #9
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

блин, не изобретай велосипед, есть std::list/std::vector, там есть insert.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 26.02.2011, 22:45   #10
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

insert вставит в конец, а я хочу вставить так чтоб сортировка не нарушалась
ololo-schoolboy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбиение hrusha2006 Помощь студентам 0 07.11.2010 09:13
Ввести несколько чисел (кол-во чисел запрашивать с экрана). Определить, сколько чисел, меньших заданного Lirika Помощь студентам 0 08.05.2010 21:39
Разбиение числа на слагаемые p1r2o3 Помощь студентам 23 16.03.2010 13:38
Все возможные слагаемые anGeee Паскаль, Turbo Pascal, PascalABC.NET 4 04.12.2008 20:22
Разложение числа на слагаемые Oleg-vp Общие вопросы Delphi 5 30.10.2007 10:43