舉個栗子:輸入 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