java输入一个整数N,打印1~n位数
举个栗子:输入 3 ; 打印1,2,3......999
这里要注意一个坑,不可以直接算出最大的数,然后从1开始打印 。因为当n足够大时,n位数必定会超出int范围和long范围
所以我们需要用字符串来解题 , 模拟加法运算,循环打印。
思路:
1.先将n位数最大的一项+1用字符串str标记
2.StringBuilder对象ans用来做加法运算以及打印操作
3.boolean类型flag 用来标记是否需要进位
4.每次都从ans最后一位开始+1,需要进位时,将此时i的位置值为0,紧接着判断它的前一位置的字符是否+1需要进位,如果加一不需要进位,直接+1,break即可,否则继续循环下去。对于99这类数+1后,字符已经遍历完,flag为true,需要给ans 0号位置插入1 。
5.当ans和str的值相等时,循环结束
代码实现:
public static void main(String[] args) { getMums(3); } //flag用来判断需不需要进位 static boolean flag; private static void getMums(int n) { //str 用来保存最大的数,作为结束循环的条件 StringBuilder str = new StringBuilder(); str.append(1); while (n != 0) { str.append(0); n--; } StringBuilder ans = new StringBuilder(); ans.append(1); //ans字符串累加操作 while (!ans.toString().equals(str.toString())) { System.out.println(ans); //加一的判断 for (int i = ans.length() - 1; i >= 0; i--) { //涉及进位 if (ans.charAt(i) == '9') { ans.replace(i, i + 1, "0"); flag = true; continue; } else { //找到累加的位置 ans.replace(i, i + 1, Integer.toString((ans.charAt(i) - '0' + 1))); flag = false; break; } } //当数字类似于 99 999 时,头部插入1. if (flag == true) { ans.insert(0, 1); } //结束条件 if (str.toString().equals(ans.toString())) { return; } } }
结果:
1
2
3
...
998
999