问题描述
对于长度为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));
}
}
}