[剑指Offer]打印1到最大的n位数

来源:互联网 发布:遇到网络诈骗怎么半 编辑:程序博客网 时间:2024/05/16 09:05

题目描述

输入数字n,按顺序打印出从1到最大的n位十进制数。

陷阱:n非常大的时候,int、long均不好使。

解题思路

思路一:
     我们可以模拟加法来打印。需要注意的是进位问题和是否已经到达最大的n位十进制数。

思路二:
     采用递归的解法。数字的每一位都可能是0-9中的一个数,然后设置下一位,递归结束的条件是我们设置数字的最后一位。


代码


模拟加法实现

/** * 模拟加法来顺序打印1到最大的n位数 * @param n */public static void print1ToMaxOfNDigitsByAnalogAddition(int n) {if (n <= 0)return;byte[] num = new byte[n];boolean flag = true;//标记是否已经是最大的n位数int takeOver = 0;// 进位符Arrays.fill(num, (byte) 0);while (flag) {takeOver = 0;// 进位符归0for (int i = n - 1; i >= 0; i--) {int temp = (num[i] - (byte) 0) + takeOver;// 计算当前位的值if (i == n - 1) {temp++;// 如果是最末位则自增}if (temp >= 10) {// 当前位大于10if (i == 0) {// 如果第0位已经大于10,则将变为n+1位flag = false;} else {temp -= 10;takeOver = 1;num[i] = (byte) temp;}} else {// 如果没有进位,则结束num[i] = (byte) temp;break;}}if (flag) {//打印数组int i = 0;while (i < n && num[i] == (byte) 0) {i++;}while (i < n) {System.out.print(num[i] - (byte) 0);i++;}System.out.println("");}}}

递归实现

/** * 递归来顺序打印1到最大的n位数 * @param n */public static void print1ToMaxOfNDigitsByRecursive(int n) {if (n <= 0)return;byte[] num = new byte[n];for (int i = 0; i < 10; i++) {num[0] = (byte) i;print1ToMaxOfNDigitsRecursively(num, 0);}}public static void print1ToMaxOfNDigitsRecursively(byte[] num, int index) {if (index == num.length - 1) {//打印数组int i = 0;while (i < num.length && num[i] == (byte) 0) {i++;}while (i < num.length) {System.out.print(num[i] - (byte) 0);i++;}System.out.println("");return;}for (int i = 0; i < 10; i++) {num[index + 1] = (byte) i;print1ToMaxOfNDigitsRecursively(num, index + 1);}}


0 0