题目:输入数字n,按顺序打印出从1最大 n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
易错点:由于没有规定n的范围,所以当输入的n很大的时候,直接使用int或者long会导致溢出。因此,涉及大数问题,必须使用String。
思路:在字符串上模拟数字加法。以n=3为例,模拟加法时存在的几种情况:
将字符串设置成char[n+1],便于打印和自增。(+1的原因会在后面有注明)
- 000-009,即正常加法,个位+1。char[]最后一位自增。
- 009-010,进位。解决方法用3。
- 099-100,连续进位。设置flag判断当前位置是否需要进位,while(flag)循环每一位。
- 998-999,结束打印。判断char[]第一位是否为1,如果为1,则结束。
辅助函数:打印char[]。注:前面是0的不需要打印。
功能函数:while(num[0] == '0') { 内部循环加1 }
注意:char[n+1],当char[]第一位为1是,则在辅助函数中打印为空,并在功能函数中结束循环。便于最大值的判断。
public void Print1ToMaxN(int n) {
char[] num = new char[n+1]; // 多一位,以便判定最大值
for (int j=0; j<num.length; j++)
num[j] = '0';
while (num[0] == '0') {
int i = n;
int flag = 1;
while (flag==1 && i>=0) { // 模拟个位+1
num[i] += flag;
if (num[i] > '9') { // 进位
num[i] = '0';
flag = 1;
} else // 未进位,正常加1
flag = 0;
i --;
}
System.out.println(PrintNum(num));
}
}
public String PrintNum(char[] num) { // 不打印数组前面的0
if (num[0] != '0') // 最大值+1,输出空
return "";
String str = String.valueOf(num);
int i = 0;
while (num[i] == '0')
i++;
return str.substring(i);
}