题17:从一打印到n位最大数
输入一个数字n,按顺序打印出从一到最大的n位十进制数。
例:n = 3,则打印1、2、3…999
- 由于n的数值不确定,n的数值可能很大(打印的数可能是大数),所以我们不能用int和long类型的数来表示,这时我们会想到用字符串和数组表示大数。
- 用数组或字符串表示大数后,我们需要想的是利用字符串或数组实现数字的加一操作
- 实现了加一操作,接下来需要判断什么时候达到了最大数
- 然后就是把数字打印出来,并且需要符合正常的阅读习惯
我们可以观察到最大数的情况是9…9,如果都是9发生了进位,那么第一个9就会发生进位,其余的情况下第一位数不会发生进位,所以我们只需要判断进行加一操作的时候,观察第一位数是否产生了进位,如果产生了进位,那么就停止加一。
详细步骤可以看代码注释
public class PrintToN {
public boolean increment(char[] number){
//溢出标志
boolean isOverFlow = false;
//进位标志
int nTakeOver = 0;
//数字长度
int len = number.length;
//进行加一操作
for (int i = len - 1; i >=0 ; i--) {
//获取第n位上的数字,并且加上进位
//另外:char强制转化为int,得到的是对应的ascii码,把char转化为int的最简单办法是 减去 '0'
int sum = number[i] - '0' + nTakeOver;
//如果是个位上的数,sum加一
if(i == len - 1){
sum++;
}
//sum>=10,说明产生了进位
if(sum >= 10){
//如果产生的进位是最高位,则表示溢出
if(i == 0){
isOverFlow = true;
}else{
//普通进位
sum -= 10;
nTakeOver = 1;
//另外:把int转化为char,不能直接强转,需要加上‘0’后再强转
number[i] = (char) (sum + '0');
}
}else{
//没有产生进位
number[i] = (char)(sum + '0');
break;
}
}
return isOverFlow;
}
public void printNumber(char[] number){
//是否打印开始标志
boolean isBegining = false;
for(int i = 0;i < number.length;i++){
if(!isBegining && number[i] != '0'){
isBegining = true;
}
//开始打印
if(isBegining){
System.out.print(number[i]);
}
}
System.out.println();
}
//test
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
if(n <= 0){
return;
}
//数字表示,初始每一位为0
char[] number = new char[n];
for(int i = 0;i < n;i++){
number[i] = '0';
}
PrintToN printToN = new PrintToN();
while(!printToN.increment(number)){
printToN.printNumber(number);
}
}
}