[枚举坤坤]二进制枚举练习

众所周知,我们学过二进制枚举,今天我们来做道题,看看二进制枚举的震撼。

比特数

题目描述

输入一个整数 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;
}

 呵 相信大家也感受到了二进制枚举的震撼,多多做题吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值