题目:输入数字n,按顺序打印从1到最大的n位的十进制数。比如,输入3,则打印出1、2、3一直到999。
这个题目好像很简单,求出最大的n位数,然后for循环打印就好了。但是Java中int类型的范围是-2147483648~2147483647,也就是输入的n如果是10,那么int的范围就不够了。我们事先不知道这个数的范围,这一类关于大数的问题,经常使用字符串或者说是字符数组来解决。这里,我们用一个容量为n的字符数组来表示n位数字,在字符数组上模拟数字加法,每次加一,然后打印数组里面的有效数字。
主方法的Java代码如下:
public static void print1ToMaxOfDigits1(int n){
if(n<=0)
return;
//长度为n的char数组表示n位的整数,初始值都为字符'0'
char[] number=new char[n];
for(int i=0;i<number.length;i++){
number[i]='0';
}
while(!increment(number)){
printNumber(number);
}
}
increment()方实现数字自增,并且判断是否自增成功,也即有没有到最大的n位数;printNumber()方法实现以我们习惯的数字表示形式打印数组中的字符。
private static boolean increment(char[] number) {
boolean isOverflow=false;
//carry记录是否有进位
int carry=0;
int len=number.length;
for(int i=len-1;i>=0;i--){
//两个字符相见,就是对应的ASCII码相减
//得到的nSum是int类型
int nSum=number[i]-'0'+carry;
//i==len-1 就是数字的个位,每次个位加1
if(i==len-1)
nSum++;
//处理进位
if(nSum>=10){
if(i==0)
//i=0是数字最高位,nSum>=10就溢出了
isOverflow=true;
else{
//值减10,进位改为1
nSum-=10;
carry=1;
number[i]=(char) ('0'+nSum);
}
}else{
//不需要进位时,转为数字对应的字符表达存进数组
number[i]=(char) ('0'+nSum);
break;
}
}
return isOverflow;
}
这个函数里面需要注意的是数组中字符型的'0'-'9'与数字0-9转化。printNumber很简单,代码如下:
private static void printNumber(char[] number) {
boolean isBeginning=false;
for(int i=0;i<number.length;i++){
if(number[i]!='0')
isBeginning=true;
if(isBeginning)
System.out.print(number[i]);
}
System.out.println();
}
测试输出太多,不放了。递归的解法还没搞清楚,弄清楚了再贴上来!