1. 字符串模拟数字加法
第一步:字符串表达的数字上模拟加法
第二步:字符串表达的数字打印出来
public static void printToMaxOfDigits(int n) {
if (n <= 0) return;
char number[] = new char[n]; //使用数组来存储大数
for (int i = 0; i < number.length; i++) {
number[i] = 0;
}
while (!incrementNumber(number)) { //字符串表达的数字上模拟加法
printNumber(number); //字符串表达的数字打印出来
}
}
//实现了用O(1)时间判断是不是已经到最大的n位数
private static boolean incrementNumber(char[] num) {
boolean isOverflow = false; // 判断是否溢出
int nTakeOver = 0; //判断是否进位
int nLength = num.length;
for (int i = nLength - 1; i >= 0; i--) {
int nSum = num[i] - '0' + nTakeOver;//取到第i位的字符转换为数字 + 进位符
if (i == nLength - 1) ++nSum; //末尾加1
if (nSum == 10) {
if (i == 0) {
isOverflow = true;
} else {
nSum -= 10;
nTakeOver = 1;
num[i] = (char) ('0' + nSum);
}
} else {
num[i] = (char) (nSum + '0');
break;
}
}
return isOverflow;
}
//在数字的前面补0打印的时候这些补位的0不应该打印出来
private static void printNumber(char[] number) {
boolean isBeginning0 = true;
int nLength = number.length;
for (int i = 0; i < nLength; i++) {
if (isBeginning0 && number[i] != '0') {
isBeginning0 = false;
}
if (!isBeginning0) {
System.out.print(number[i]);
}
}
System.out.println();
}
2. 数字排列解法
全排列用递归实现,数字的每一位都可能是0~9中的一个数,然后设置下一位。
static void printToMaxOfNDigits(int n) {
if (n <= 0) return;
char[] number = new char[n];
for (int i = 0; i < 10; i++) {
number[0] = (char) (i + '0');
printToMaxOfNDigitsRecursively(number,n,0);
}
}
static void printToMaxOfNDigitsRecursively(char[] number, int length, int index) {
if (index == length - 1) {
printNumber(number);
return;
}
for (int i = 0; i < 10; i++) {
number[index + 1] = (char) (i + '0');
printToMaxOfNDigitsRecursively(number, length,index + 1);
}
}