如果输入3,则打印1、2、3、一直到最大的三位数999
这是一个典型的大数问题,因为输入的n位数,所能表达的数字可能会超过long long型数字。
思路是这样:
用数组来保存数字,即如果输入是3则定义一个3维数组 。
定义两个函数:
一个用来使数组中的数字加1,每次调用该函数,则数组中的数字会加1,但是要保证该数组不溢出,即不超过999.
一个用来打印数组。因为最开始的时候数组保存的是三位0,但是高位的0不能打印。
package Jianzhi;
public class jianzhi_17 {
public static void main(String[] args) {
int[] number=new int[3];
while(!increment(number)) {//只要不溢出,每一次调用都会改变里面的数值
print(number);
System.out.println();
}
}
public static boolean increment(int[] number) {//每次调用该函数就会改变该数组的值
if(number.length<1)
throw new RuntimeException("invalid input");
boolean isOverFlow=false;//定义当前数组是否溢出,即是否超过最大保存值
int carry=0;
for(int i=number.length-1;i>=0;i--) {//从最后一位开始保存
int sum=number[i]+carry;
if(i==number.length-1) {
sum++;//每次调用都将最低位加1
}
if(sum<10) {//当sum小于10普通值保存在数组中
number[i]=sum;
break;//注意只有在sum<10执行到这里时才退出循环,只有到这里才退出循环。
}else {//当sum大于等于10要考虑是否超过最大边界
if(i==0) {
isOverFlow=true;
}else {
carry=1;//普通进位
number[i]=0;//并将该位重新置0
sum=0;//和也置为0
}
//当此前number中保存的是[0,0,9],在执行到这里时,sum=10,将carry=1,sum=0,number[i]=0;
//还将进行第二个for循环,向前计算一步,直到sum<10,不在发生进位
}
}
return isOverFlow;
}
public static void print(int[] number) {
boolean isBegining=true;
for(int i=0;i<number.length;i++) {
if(isBegining&&number[i]!=0)//要注意这里要判断是否为第一个非0的数字不能
isBegining=false;
if(!isBegining)
System.out.print(number[i]);
}
}
}