关于蛮力法求生成子集问题
对于算法分析中的问题我已经不想对自己说什么了,到了大三了,竟然还是小白。对生成子集问题我研究了一下午,最后终于想通了。
思路: 1.利用<math.h> 头文件中的pow(x,y)函数来求得2的n次方,作为外循环。2.然后写一个将10进制数转换为2进制数的函数(当然,C中有专门的转换进制的函数在<stdlib.h>中,但是,他转换下来 5不是0101而是101,这就导致需要分开判断,所以不用itoa函数)。
如下:
conversation(int n,int b[MAX])
{
int I=0;
for(I;i<MAX;i++)
{
b[I]=n%2;
n=n/2;
if(n==0)
break;
}
}
3.利用以上函数转换为2进制后,再回到循环体中,利用循环来 输出每次的子集。
完整代码如下:
#include<iostream>
#include<stdlib.h>
#include<String>
using namespace std;
#define MAXSIZE 10
void conversion(int n,int b[])
{
int i=0;
for(i;i<MAXSIZE;i++)
{
b[i]=n%2;
n=n/2;
if(n==0)
break;
}
}
void main()
{
int n;
cout<<"请输入是几个数的生成子集:\n";
cin>>n;
if(n<=MAXSIZE)
{
int b[MAXSIZE];
bool flag = false;
for(int i=0;i<pow(2,n);i++)
{
conversion(i,b);
for(int j=0;j<MAXSIZE;j++)
{
if(b[j]==1)
{
cout<<j+1;
flag = true;
}
}
if(!flag)
cout<<"空";
cout<<endl;
}
}
else
cout<<"数太大了\n";
}
做完这个觉得更应该拿出时间来好好学习算法,这么简单的都设计不出来,未来怎么会成功!!!
加油!!!!
conversation(int n,int b[MAX]) { int I=0; for(I;i<MAX;i++) { b[I]=n%2; n=n/2; if(n==0) break; } } 3.利用以上函数转换为2进制后,再回到循环体中,利用循环来 输出每次的子集。 完整代码如下: #include<iostream> #include<stdlib.h> #include<String> using namespace std; #define MAXSIZE 10 void conversion(int n,int b[]) { int i=0; for(i;i<MAXSIZE;i++) { b[i]=n%2; n=n/2; if(n==0) break; } } void main() { int n; cout<<"请输入是几个数的生成子集:\n"; cin>>n; if(n<=MAXSIZE) { int b[MAXSIZE]; bool flag = false; for(int i=0;i<pow(2,n);i++) { conversion(i,b); for(int j=0;j<MAXSIZE;j++) { if(b[j]==1) { cout<<j+1; flag = true; } } if(!flag) cout<<"空"; cout<<endl; } } else cout<<"数太大了\n"; }