题目描述
输入数字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;// 进位符归0
for (int i = n - 1; i >= 0; i--) {
int temp = (num[i] - (byte) 0) + takeOver;// 计算当前位的值
if (i == n - 1) {
temp++;// 如果是最末位则自增
}
if (temp >= 10) {
// 当前位大于10
if (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);
}
}