众所周知,我们学过二进制枚举,今天我们来做道题,看看二进制枚举的震撼。
比特数
题目描述
输入一个整数 nn,从小到大输出所有可以用 nn 个比特表达的数。
输入格式
输入一个整数 nn( n \lt 15n<15 )
输出格式
从小到大输出若千个二进制数,每行一个比特数(不能忽略前导零)
样例
输入数据 1
2
输出数据 1
00
01
10
11
输入数据 2
3
输出数据 2
000
001
010
011
100
101
110
111
先看看我们用十进制转二进制再加上累加器的遍历做出来的:
#include<bits/stdc++.h>
using namespace std;
string t2(long long num)//十进制转二进制函数
{
string str;
if(num==0)str='0';
while(num>0)
{
if(num%2<10)str+=num%2+'0';
else str+=num%2-10+'A';
num=num/2;
}
reverse(str.begin(),str.end());
return str;
}
long long n,ans,len;
long long a[16]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384};//为后面的累加打下基础
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{
ans+=a[i];//累加整范围(这里是指十进制的范围)
}
for(int i=0;i<=ans;i++)//开始遍历从1到ans
{
len=t2(i).size();
for(int j=1;j<=n-len;j++)cout<<0;//共有n个字符,前(n-len)个是0
cout<<t2(i)<<endl;//后面表达的是数
}
return 0;
}
再看一下用二进制枚举写出来的:
#include<bits/stdc++.h>
using namespace std;
int n,x[20],k,len;
bool flag=false;
int main(){
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>x[i];
}
int kg;
for(int i=0;i<(1<<n);i++)//共有2^n个数
{
for(int j=n-1;j>=0;j--)//位数
{
kg=i&(1<<j);
if(kg)//也可以将上面的式字直接带进括号里
{
cout<<1;
}
else
{
cout<<0;
}
}
cout<<endl;
}
return 0;
}
呵 相信大家也感受到了二进制枚举的震撼,多多做题吧。