01字串
资源限制
时间限制:1.0 s 内存限制:256.0 MB
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
输入格式
本试题没有输入。
输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。
样例输出
00000
00001
00010
00011
<以下部分省略>
思路
- 憨憨一点,直接打表,全部写出来再输出
- 利用五层for循环,每一层输出一个0或1,共有 种可能
- 利用已有的标准库函数 #include <bitset>
- 将十进制整数转换位二进制字符串,再根据长度判断其是否需要补0
- 可以使用函数 #include <stdlib.h> 中的 itoa() 函数
- 手动完成十进制整数到二进制整数的转换
代码
方案一:打表
32行输出一个一个输出吧
方案二:五层for循环
#include<iostream>
using namespace std;
int main(){
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
for (int k=0;k<2;k++)
for (int t=0;t<2;t++)
for (int p=0;p<2;p++)
cout<<i<<j<<k<<t<<p<<endl;
return 0;
}
方案三:bitset方法
#include<iostream>
#include<bitset>
using namespace std;
int main(){
for (int i=0;i<32;i++){
bitset<5> res;
res = i;
cout << res <<endl;
}
return 0;
}
方案四:itoa()方法自动转换位二进制字符串
#include<iostream>
#include <stdlib.h>
using namespace std;
int main(){
char strs[100];
for (int i = 0; i < 32; i++) {
string str = itoa( i, strs, 2 );
switch (str.length()) {
case 1:
str = "0000" + str;
break;
case 2:
str = "000" + str;
break;
case 3:
str = "00" + str;
break;
case 4:
str = "0" + str;
break;
}
cout << str << endl;
}
return 0;
}
方案四:手写二进制转换
#include<iostream>
#include<bitset>
#include <stdlib.h>
using namespace std;
//手写二进制
string trans(int n){
string str[2]={"0","1"};
string res="";
if (n==0) return res+"0";
while(n){
res=str[n%2]+res;
n/=2;
}
return res;
}
int main(){
int n=32;
for (int i=0;i<n;i++){
string str = trans(i);
switch (str.length()) {
case 1:
str = "0000" + str;
break;
case 2:
str = "000" + str;
break;
case 3:
str = "00" + str;
break;
case 4:
str = "0" + str;
break;
}
cout<<str<<endl;
}
return 0;
}
总结
为什么我要写这么多呢,主要是为了熟悉C++标准库和非标准库函数的用法,比如字符串和十进制整数的相互转换(还有stirngtream),以及十进制整数到其他进制数的转换等。