蓝桥杯 0 1字串
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
做完之后发现基本上都使用了多重循环嵌套的方式,我认为按照10进制转2进制的方法,时间复杂可能会低一些。
#include<iostream>
using namespace std;
#include<string>
int main() {
int i,len,k;
string t;
for (i = 0; i < 32; i++) {
t = "";
k = i;
if (i == 0) {
cout << "00000";
}
while (i >0) {
if (i % 2 == 0){
t = t + '0';
i= i/ 2;
}
else
{
t = t + '1';
i = (i - 1) / 2;
}
}
len = t.length();//计算当前字串的长度,之后同构添0的方法将位数对齐。
if (len % 5 == 4){t = t+"0";
{
for (i = t.length() - 1; i >= 0; i--)
cout << t[i];
}
}
if (len % 5 == 3){t = t+"00";
{
for (i = t.length() - 1; i >= 0; i--)
cout << t[i];
}
}
if (len % 5 == 2) { t = t+ "000";
{
for (i = t.length() - 1; i >= 0; i--)
cout << t[i];
}
}
if (len % 5 == 1) {t = t+ "0000";
{
for (i = t.length() - 1; i >= 0; i--)
cout << t[i];
}
}
if (len % 5 == 0) {
for (i = t.length() - 1; i >= 0; i--)
cout << t[i];
}
cout << endl;
i = k;
}
}
这里还要注意的一点就是转换成二进制的时候字符串倒着表示才是实际对应的十进制,二字符串存储时则是正着存储的,所以输出时要对输出顺序和补0的位置进行讨论。