打印从1到最大的n位数
输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
思路
先找出最大值,然后遍历输出
public void print1ToMaxOfNDights1s(int n) {
int number = 1;
int i = 0;
while (i++ < n) {
number *= 10;
}
for (i = 1; i < number; i++) {
System.out.print(i + " ");
}
System.out.println();
}
陷阱:n过大时是大数问题,不能简单用int或者long数据输出,需要采用字符串或者数组表达大数。
- 采用字符串模拟加法
//解决1 模拟加法
public void print1ToMaxOfNDigits02(int n) {
if (n < 0) {
return;
}
char[] number = new char[n];
for (int k = 0; k < number.length; k++) {
number[k] = '0';
}
while (!increment(number)) {//模拟加法
printCharNumber(number);//打印
}
}
private void printCharNumber(char[] number) {
boolean isBeginning0 = true;
for (int i = 0; i < number.length; i++) {
if (isBeginning0 && (number[i] - '0') != 0) {//忽略前面的0
isBeginning0 = false;
}
if (!isBeginning0) {
System.out.print(number[i] - '0');
}
}
System.out.println();
}
//对字符串进行加1操作,当number达到最大值后返回为true
//低位加1 到10进位
private boolean increment(char[] number) {
int nTackOver = 0;//进位
for (int i = number.length - 1; i >= 0; i--) {
int nSum = (number[i] - '0') + nTackOver;
// number[i]-'0'是把char转化为int,nTakeOver代表进位
if (i == number.length - 1) {
nSum++;
}
if (nSum >= 10) {
if (i == 0) {
return true;//超出范围
}
nTackOver = 1;
nSum -= 10;
number[i] = (char) (nSum + '0');
} else {
number[i] = (char) (nSum + '0');
break;//高位不变跳出循环
}
}
return false;
}