蓝桥杯 基础练习 01 字串
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100请按从小到大的顺序输出这32种01串。
输入格式
本试题没有输入。
输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。
样例输出
00000
00001
00010
00011
<以下部分省略>
在这里用两种方法来解决。
方法1-每次进位都用 if 判断
一开始没想太多,直接用了好多 if,好吧很不好看。
#include <iostream>
using namespace std;
int main ()
{
string A ("00000");
for (int i = 0; i < 32; i++)
{
cout << A << endl;
/*1、如果最后一位是1,那么向前面进一位,但要先判断前面是不是1,以此类推*/
/*2、每次进一位,后面所有位都变为0*/
if (A[4] == '1')
if (A[3] == '1')
if (A[2] == '1')
if (A[1] == '1')
{
A[0] = '1';
A[1] = A[2] = A[3] = A[4] = '0';
}
else
{
A[1] = '1';
A[2] = A[3] = A[4] = '0';
}
else
{
A[2] = '1';
A[3] = A[4] = '0';
}
else
{
A[3] = '1';
A[4] = '0';
}
else
A[4] = '1';
}
return 0;
}
方法2-十进制转二进制
显然,这种方法更简洁
#include <iostream>
#include <string>
using namespace std;
void ToBin (int n)
{
int a[5];
int temp;
int j = 0;
while (j < 5)
{
temp = n % 2; /* 求二进制的方法就是不断取余 */
a[j++] = temp; /* 等价于:a[j] = temp; j++; 用一句更简洁*/
n /= 2; /* 取余之后,除数还要除以二,才能继续下一趟取余 */
}
for (j = 4; j >= 0; j--)
cout << a[j]; /* 因为求二进制是从下到上写出每一位余数,所以需要倒序输出数组 */
cout << endl;
}
int main ()
{
for (int i = 0; i < 32; i++)
ToBin (i);
return 0;
}