题目:输入数字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
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;
}
private static void printNumber(char[] number) {
boolean isBeginning=false;
for(int i=0;i