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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2009, 13:36   #1
Modlika17
 
Регистрация: 11.04.2009
Сообщений: 8
Печаль с++ Перебор всех возможных подмножеств множества целых чисел

всем привет))))
пожалуйста, помогите решить задачку!!!!! очень нужно, срочно!!!
программа перебора всех возможных подмножеств множества целых чисел,т.е.
если с клавиатуры вводим, например 3, то на экране должно быть:
123
12
23
13
3
2
1
пустое множество не обязательно)))
заранее спасибо!!!!!!
Modlika17 вне форума Ответить с цитированием
Старый 11.04.2009, 13:55   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Не понял, по какому принципу строится подмножество (кстати, самого множества я что-то тоже не вижу).

Я правильно понял, что если ввести N, то нужно вывести все комбинации из N цифр, где каждая цифра может быть от 1 до N?
------------
В общем, предоставляйте свои наработки.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 11.04.2009, 19:28   #3
Modlika17
 
Регистрация: 11.04.2009
Сообщений: 8
По умолчанию

Да, если ввести N, то нужно вывести все комбинации, их будет 2^N. где каждая цифра может быть от 1 до N.
Modlika17 вне форума Ответить с цитированием
Старый 11.04.2009, 20:19   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Как вариант:
Код:
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;

void fun(int N, int k, string tekS)
{
if(k==N)
 {
  cout<<tekS<<endl;
  return;
 }
for(int i=k+1;i<=N;i++)
  fun(N,i,tekS+(char)(i+48));

if(tekS=="")
 for(int i=N-1;i>=1;i--)
  cout<<i<<endl;
return;
}

int main()
{
int N;
cout<<"Enter N: ";
cin>>N;
fun(N,0,"");

getch();
return 0;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 11.04.2009, 21:20   #5
Modlika17
 
Регистрация: 11.04.2009
Сообщений: 8
По умолчанию

Спасибо, конечно)))))
Но эта прога не все подмножества выводит.
И объясните пожалуйста алгоритм этой проги, для чего там tekS????
Modlika17 вне форума Ответить с цитированием
Старый 11.04.2009, 21:25   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Спасибо, конечно)))))
Но эта прога не все подмножества выводит.
Пожалуйста. Если вы говорите, что выводит не все подмножества, то приведите пример правильной работы.
Для вашего предыдущего примера работает как надо.

Цитата:
для чего там tekS????
При каждом рекурсивном вызове функции формируется строка (подмножество), которая выводится в конце.

Кажется, там все и так ясно:
Код:
void fun(int N, int k, string tekS)
{
if(k==N)  // если сформировали подмножество...
 {
  cout<<tekS<<endl;  // выводим его
  return;               // и выходим
 }
for(int i=k+1;i<=N;i++)   
  fun(N,i,tekS+(char)(i+48)); // подбираем следующую цифру для подмножества

if(tekS=="")    // когда все вывели, нужно еще вывести оставшиеся варианты
 for(int i=N-1;i>=1;i--)
  cout<<i<<endl;
return;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 11.04.2009, 21:46   #7
Modlika17
 
Регистрация: 11.04.2009
Сообщений: 8
По умолчанию

Sazary, вы то сами прогу проверяли?????
Например, если с клавиатуры ввели 3, то ваша прога не выводит подмножество {1,2}.
Modlika17 вне форума Ответить с цитированием
Старый 11.04.2009, 22:27   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Я всегда проверяю свои программы.
Но да, не заметил, извиняюсь.
Тогда вот так:
Код:
#include <iostream>
#include <conio.h>
#include <string.h>
using namespace std;

void fun(int N, int m, int tek, int k, string tekS)
{
 if(tek>=m)
  {
   cout<<tekS<<endl;
   return;
  }
 for(int i=k+1; i<=N; i++)
  fun(N,m,tek+1,i,tekS+(char)(i+48));

}

int main()
{
int N;
cout<<"Enter N: ";
cin>>N;
for(int i=1;i<=N;i++)
 fun(N,i,0,0,"");

getch();
return 0;
}
Поясняю аргументы функции:
Код:
void fun(int N, int m, int tek, int k, string tekS)
N - собственно, N
m - длина подмножества. Изменяется от 1 до N
tek - номер текущего элемента подмножества. Изменяется от 1 до m
k - значение предыдущего элемента
tekS - строка, в которую пишутся элементы подмножества
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 11.04.2009 в 22:29.
Sazary вне форума Ответить с цитированием
Старый 11.04.2009, 22:44   #9
Modlika17
 
Регистрация: 11.04.2009
Сообщений: 8
По умолчанию

Sazary, спасибо ОГРОМНОЕ!!!
А вы можете мне объяснить почему у меня не работает библиотека conio.h, выдает ошибку в этом месте, и там где getch()-тоже ошибку выдает . Для чего вообще нужна эта библиотека??????
Modlika17 вне форума Ответить с цитированием
Старый 11.04.2009, 22:47   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Modlika17, А какую ошибку-то?

В данной программе conio требуется только для getch(), который в данном случае нужен только для задержки перед выходом.

Можете заменить его на
Код:
cin.get()
Так даже лучше будет - меньше лишнего.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать перебор всех возможных IP-адресов (С++) ak74m Помощь студентам 0 09.04.2009 13:59
Перебор всех возможных вариантов [MI_nor] Общие вопросы C/C++ 9 01.04.2009 21:17
перебор чисел (pascal) mozdok15rus Помощь студентам 7 19.03.2009 17:54
массив целых чисел -ushёl- Помощь студентам 4 28.02.2009 19:18
перебор всех элементов в TtreeView vitalik007 Общие вопросы Delphi 10 09.04.2008 15:44