题目信息
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
输入格式
本试题没有输入。
输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。
样例输出
00000
00001
00010
00011
<以下部分省略>
解题思路
主要考察
本题给出的考察关键字是:循环
。
解题思路
这个问题有好几种解法:我的解法是:可以理解为让我们输出从0-31的二进制形式,规定每位二进制数的长度为5位,不足五位则在前面补0。我是先将每一位数利用栈转换成二进制,然后再补零输出。还有一种更快的方法是直接使用C++中的二进制函数库<bitset>
这个方法是经过搜索之后知道的。直接从0-31输出每一个数的5位二进制形式的数。
下面是C++api中<bitset>
的用法(具体的用法可以查看C++ api):
还有一种解法是使用递归来解,具体的解题方式可以看这位大佬的博客:蓝桥杯-01字串
方法1 解题代码
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main(){
char s[2] = {'0','1'};
for(int i=0;i<32;i++){
string bin; //用来存放求出来的二进制数
stack<char> bin_num;
int j = i;
if(j == 0){
bin_num.push('0');
}else{
while(j){
bin_num.push(s[j%2]);
j /= 2;
}
}
while(!bin_num.empty()){
bin += bin_num.top();
bin_num.pop();
}
int len = bin.length();
if(len == 1){
bin = "0000" + bin;
}else if(len == 2){
bin = "000" + bin;
}else if(len == 3){
bin = "00" + bin;
}else if(len == 4){
bin = "0" + bin;
}
cout<<bin<<endl;
}
return 0;
}
方法2解题代码
#include<iostream>
#include<bitset>
using namespace std;
int main(){
for(int i=0;i<32;i++){
cout<<bitset<5>(i)<<endl;
}
return 0;
}
方法3解题代码
代码参考地址:蓝桥杯-01字串
#include<iostream>
using namespace std;
char a[6];
void dfs(int i){
if(i==5){
cout<<a<<endl;
return;
}
a[i]='0';
dfs(i+1);
a[i]='1';
dfs(i+1);
}
int main(){
a[5]=0;
dfs(0);
return 0;
}
以上就是对于本题的解题思路了。如果你觉得我的文章对你有用请点个赞支持一下吧,喜欢我写的文章那么请点个关注再走鸭。如果此文章有错误或者有不同的见解欢迎评论或者私信。
我是ACfun:一个成长中的程序猿,感谢大家的支持。