題目信息
問題描述
對於長度爲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:一個成長中的程序猿,感謝大家的支持。