输入数字n,按照顺序打印从1到最大的n位十进制数。比如n=3,则打印1到999
最容易想到的是根据n求出最大的值是多少,然后使用一个for循环即可打印出所有数字,不过如果n很大的话,会造成溢出,这道题的考点就在大数问题。
大数可以使用字符串去表示,突破固有类型的限制,从而可以解决大数问题。
第一种
使用字符来模拟数字的加法。
public void Print1ToMaxOfNDigits(int n) {
if(n < 1){
return;
}
char[] number = new char[n];
for (int i = 0; i < number.length; i++) {
number[i] = '0';
}
int count = 0;
while(incrementNumber(number,n)){
printNumber(number);
count++;
}
System.err.println("count = " + count);
}
private void printNumber(char[] num) {
StringBuilder sb = new StringBuilder();
boolean flag = false;
for(int i = 0 ; i < num.length; i++) {
if(flag == true){
sb.append(num[i]);
}else if(num[i] != '0'){
sb.append(num[i]);
flag = true;
}
}
System.err.println(sb);
}
private boolean incrementNumber(char[] number,int n ) {
int cur = n-1;
while (cur >= 0) {
char num = number[cur];
if( num < '9'){
number[cur] = (char)(num + 1);
return true;
}else if(num == '9'){
number[cur] = '0';
cur--;
}
}
return false;
}
第二种
打印数字相当于一个排列组合的问题,将所有组合按照顺序列出来即可。这种递归思路需要好好思考理解。
public void Print1ToMaxOfNDigits(int n) {
if (n < 1) {
return;
}
char[] number = new char[n];
for (int i = 0; i < number.length; i++) {
number[i] = '0';
}
for (int i = 0; i < 10; i++) {
number[0] = Character.forDigit(i, 10);
recur(number, 0);
}
}
private void recur(char[] num, int index) {
if (index == num.length - 1) {
printNumber(num);
return;
}
for (int i = 0; i < 10; i++) {
num[index + 1] = Character.forDigit(i, 10);
recur(num, index + 1);
}
}
//前导0不做处理 便于看结果
private void printNumber(char[] num) {
System.err.println(num);
}
网友评论