蓝桥杯练习 01字串

问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:

00000

00001

00010

00011

00100

请按从小到大的顺序输出这32种01串。

输入格式
本试题没有输入。
输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。
样例输出
00000
00001
00010
00011
<以下部分省略>

思路分析:这道题目不难,如果遇到这种题目,我可以直接在本子上面写好,然后写32个打印函数,打印出来,一样全对。但这里介绍解决这个问题的编程解法。

解法1使用递归的方式去解决:其实递归虽然代码简单,但是对于新手来说不容易写,因为不清楚程序执行到哪个地方了,还有变量在每次递归的时候变化情况稍微有点复杂。但是递归还是需要掌握的,所以借这道题目再写一下递归。

可以看到每一位都是放0和1,每次处理一位,那么递归函数首先判断是否处理完毕,如果需要继续递归,那么在上一次递归的字符后面添0或者1,在更新处理的位数即可。代码如下:

public class Main {
    public static void main(String[] args) {
        String ss = "";
        //处理第一位
        printResult(ss,1);
    }
    //每次函数的执行先判断是否处理完5位了,如果处理完就打印
    //没有处理完就将数据后面添0或1,处理位数加1,继续执行
    private static void printResult(String ss, int cnt) {
        String temp = ss.toString();
        if(cnt>5){
            System.out.println(ss);
            return;
        }
        printResult(temp+"0",cnt+1);
        printResult(temp+"1",cnt+1);
    }
}

解法2:其实仔细观察可以看到,这就是从0到31的二进制数表示,那么直接开一个循环,从0到31,每个数都输出对应的二进制即可。
但是需要注意的是,需要在某些二进制数前补0,例如5的二进制为101,那么就要在前面添加2个0,00101。这种添0的做法用数据输出精度控制即可,不清楚的可以看我的之前的文章
https://blog.csdn.net/JB666M/article/details/124353940
代码如下:

import java.text.DecimalFormat;
public class Main {
    public static void main(String[] args) {
        DecimalFormat df = new DecimalFormat("00000");
        for (int i = 0; i < 32; i++) {
            //将数据转换为二进制字符串,再解析为十进制数表示,因为format函数接受的是数,而不是字符串
            //例如5-->101(二进制字符串)-->101(十进制数据)-->00101(按照五位来输出)
            int num =  Integer.parseInt(Integer.toString(i, 2));
            //按照长度为5的格式输出数据
            System.out.println(df.format(num));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值