打印1到最大的n位数
题目描述
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印1、2、3一直到最大的3位数999.
具体实现
解题思路:用字符串来表示大数,先把每一位都置为‘0’,然后每次都在字符串表示的数字上加1,再打印出来即可。重点是要注意什么时候停止加1操作,还有打印数字的时候不能打印出前面的0
import java.util.Scanner;
public class Test {
public static void Print1ToMaxOfNDigits(int n) {
char[] ch = new char[n];
if(n < 0)
return ;
//需要先吧字符数组中的各个位置'0'
for(int i = 0; i < n; i++) {
ch[i] = '0';
}
while(!(Increment(ch))) {//+1操作,直到最高位=10需要进位才停止
PrintNumber(ch);
}
}
//+1操作
public static boolean Increment(char[] ch) {
boolean isOverflow = false; //检测是否已经加到最大n位数的标志
int TakeOver = 0;//进位数值
int len = ch.length;
for(int i = len - 1; i >= 0; i--) {
int sum = ch[i] - '0' + TakeOver;//当前位的数值
if(i == len - 1)//+1操作
sum++;
if(sum >= 10) {//当前位数值大于10,需要进位
if(i == 0) {//当前位是最高位
isOverflow = true; //加到最大值的标志;
break;
}else {//当前位不是最高位
//sum -= 10;
TakeOver = 1;//进位1
ch[i] = '0';//进位后当前位置0
}
}else {//当前位数值小于10
ch[i] ='0';
ch[i] += sum;//置'0'再加上加一后的数值sum
break;//因为一次只加一,所以需跳出
}
}
return isOverflow;
}
//输出操作
public static void PrintNumber(char[] ch) {
boolean isBegining = true;//判断跳过最前面的所有0,false为跳过了,true为还没跳过
for(int i = 0; i < ch.length; i++) {
if(isBegining && ch[i] != '0') {
isBegining = false;
}
if(!isBegining) {//跳过最前面的无效0,进行输出
System.out.print(ch[i]);
}
}
System.out.print("\t");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
Print1ToMaxOfNDigits(n);
}
}
}