蓝桥杯练习题——01字符串
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
-
法一:暴力穷举
直接输出所有结果 -
法二:五层for循环
每一个数是依次递增的,每一位相当于一个for循环由0到1,输出各位即可
#include<cstdio>
int main(){
for(int a=0;a<=1;a++){
for(int b=0;b<=1;b++){
for(int c=0;c<=1;c++){
for(int d=0;d<=1;d++){
for(int e=0;e<=1;e++){
printf("%d%d%d%d%d%\n",a,b,c,d,e);
}}}}}
return 0;
}
- 法三:找规律
最低位:0、1、0、1,从0开始,偶数为0,奇数为1, 可用i%2
次低位:0、0、1、1,从0开始,4位一循环,前面为0,后面为1,可用i%4/2
#include<iostream>
using namespace std;
int main(){
for(int i=0;i<32;i++){
cout<<i%32/16<<i%16/8<<i%8/4<<i%4/2<<i%2<<endl;
}
return 0;
}
- 综合题: 输入一个数num,输出num位的所有二进制数
思路: 开辟字符数组存放各位,按二进制不断进位的方式求解
特别注意: 字符数组最后一位必须是’\0’,使用scanf()与gets时会在末尾自动加入,如果是一位一位的使用和输出,也可以不加
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int num;
cin>>num; //读入一个数num,代表位数长度
char str[num+1]; //开辟num+1长度char数组,最后一位放'\0'代表结束
for(int i=0;i<num;i++){ //将前num位初始化为字符0
str[i]='0';
}
str[num]='\0'; //最后一位放'\0'代表结束
for(int i=0;i<pow(2,num);i++){ //循环32次
cout<<str<<endl;
str[num-1]+=1; //最后一位不断加1
for(int j=num-1;j>=0;j--){ //从最后一位向前不断判断是否有2
if(str[j]=='2'){
str[j-1]+=1;
str[j]='0';
}
}
}
return 0;
}