2013-02-22 61 views
3

我試圖生成一個集合的powerset,我寫了這段代碼。問題是,當用戶輸入兩個相似的成員時,它不能正常工作。我能做什麼? 這裏是我的代碼:編寫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"; 
    } 
} 
+1

我不確定這與C#有什麼關係,所以我刪除了C#標記。 – Freeman 2013-02-22 16:23:47

+0

爲什麼C語言標記在使用'cout'時未在C或C#中定義? – 2013-02-22 16:24:08

+2

當你使用調試器時,哪行是錯誤? – 2013-02-22 16:24:57

回答

0

好吧我無法調試你的代碼,你失蹤。但既然你發佈了你的問題,我寫了一個代碼純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)不是一組。所以代碼是可用的。

+0

我用'C'編寫,因爲你不包含帶'.h'擴展名的頭文件。 – 2013-02-22 16:53:16

+0

當你在'Y []' – 2013-02-22 16:57:28

+1

中輸入兩個相似的字符時,它也可以工作,所以我的代碼也可以工作,並且它沒有任何錯誤 – 2013-02-22 17:21:39