题目:
输入数字n,按顺序打印出从1到最大的n位十进制数。
示例:
输入3
打印1、2、3直到最大的3位数999。
答案:
需要考虑大数问题
方法一:常规思路 采用数组模拟加法
/**
* 方法一:考虑大数问题,采用数组模拟加法
*
* @param n
*/
public void print1toN(int n) {
if (n <= 0) {
return;
}
int[] array = new int[n];
while (add(array)) {
printArray(array);
}
}
private boolean add(int[] array) {
int takeOver = 0;//表示是否进位
for (int i = array.length - 1; i >= 0; i--) {
int sum = array[i] + takeOver;
if (i == array.length - 1) {
sum++;
}
if (sum < 10) {
array[i] = sum;
return true;
} else {//相加大于等于10,则产生进位
if (i == 0) {
return false;
}
sum -= 10;
array[i] = sum;
takeOver = 1;
}
}
return true;
}
/**
* 打印array数组,注意数组前面为0的要去掉
* @param array
*/
private void printArray(int[] array) {
if (array == null || array.length == 0){
return;
}
boolean isPrint = false;
for (int i = 0; i < array.length; i++) {
if (array[i] != 0) {
isPrint = true;
}
if (isPrint) {
System.out.print(array[i]);
}
}
System.out.println();
}
方法二:递归
也就是全排列的问题,每一位都有0到9,10种排列情况。
/**
* 方法二:递归思路
*
* @param n
*/
public void print1toN2(int n) {
if (n <= 0) {
return;
}
int[] array = new int[n];
print1toN2(array, 0);
}
private void print1toN2(int[] array, int index) {
if (index == array.length) {
printArray(array);
return;
}
for (int i = 0; i < 10; i++) {
array[index] = i;
print1toN2(array, index + 1);
}
}
private void printArray(int[] array) {
if (array == null || array.length == 0){
return;
}
boolean isPrint = false;
for (int i = 0; i < array.length; i++) {
if (array[i] != 0) {
isPrint = true;
}
if (isPrint) {
System.out.print(array[i]);
}
}
System.out.println();
}