[C/C++] 基础练习 01 字串

蓝桥杯 基础练习 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值