Я пытаюсь создать powerset набора, и я написал этот код. Проблема в том, что когда пользователь вводит два одинаковых члена набора, он не работает должным образом. Что я могу сделать?
Вот мой код:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
char obtain(char *p,int n)
{
int i;
for(i=0;i<n;i++)
{
cout<<"enter member"<<(i+1)<<"\n";
cin>>*(p+i);
}
return *p;
}
void set_display(char *p,int n)
{
cout<<"{";
for(int i=0;i<n;i++)
{
cout<<*(p+i)<<",";
}
cout<<"}";
}
void powset(char *p,int n)
{
unsigned int m = (double)pow((double)2, n);
int i, j;
for(i = 0; i < m; i++)
{
cout<<"{";
for(j = 0; j < n; j++)
{
if(i& (1<<j))
cout<<*(p+j);
}
cout<<"}\n";
}
}
Хорошо, я не смог отладить твой код там, где тебя не хватает. но так как вы разместили свой вопрос, я написал код в чистом виде C
, Может быть, вы найдете это полезным.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int main(int argc, char* argv[]){
int N;
char y[20]={0};
int i,j;
y[0] = 'a';
y[1] = 'b';
y[2] = 'c';
N = 3;
int powerSet;
powerSet=pow(2,N);
for(i = 0; i<(powerSet);i++){
for(j=0;j<N;j++){
if((i & (1<<j))){
printf("%c ",y[j]);
}
}
printf("\n");
}
printf("\n");
return EXIT_SUCCESS;
}
И его работа:
:~$ gcc x.c -lm -Wall
:~$ ./a.out
a
b
a b
c
a c
b c
a b c
[ОТВЕТ]
Вы ошибаетесь: когда два символа совпадают.
y[0] = 'a';
y[1] = 'a';
y[2] = 'c';
:~$ ./a.out
a
a
a a
c
a c
a c
a a c
Но это неправильно в соответствии с теорией множеств. Так как в наборе мы не можем иметь один и тот же элемент дважды (больше чем один). НО ТАКЖЕ ВХОД НЕПРАВИЛЬЕН: (a, a, c)
это не набор. Так что код пригоден для использования.
Других решений пока нет …