思路:
因为是大数,所以只能用数组或者字符串操作;因为需要判断打印到n个9为止,不需要每次判断,只需要在最高位产生进位的时候判断。
方法一:直接操作
public class solution{
------------------------------------------------
用字符数组处理
public void Print1ToMaxOfNDigits(int n){
if(n<0)
return;
char[] number=new char[n+1];
if(!Increment(number)){
PrintNum(number);
}
}
------------------------------------------------
加1操作,从低位开始+1+carry,如果小于10,直接加1后break;
如果大于10,则改位为+sum-10的值,置carry=1;如果最高位的值大于10,则说明溢出了,停止打印。
public boolean Increment(char[] number){
boolean isOverflow=false;
int carry=0;
int length=number.length;
//int sum=1;
for(int length-1;i>=0;i--){
int sum=number[i]-'0'+carry;
if(i==length-1)
sum++;
if(sum>=10){
if(i==0)
{
isOverflow=true;
} else{
sum-=sum;
carry=1;
number[i]=sum+'0';
}
}else {
number[i]=sum+'0';
break;
}
}
}
------------------------------------------------
打印数字,需要处理始位为0的情况。
public void printNum(char[] number){
boolean isBeginning0=true;
for(int i=0;i<number.length;i++){
if( isBeginning0&&number[i]!='0'){
isBeginning0=false;
}
if(!isBeginning0){
System.out.println(number[i]);
}
}
}
}
方法二:递归法
public void Print1ToMaxOfNDigits(int n){
if(n<0)
return;
char* [] number=new char[n+1];
char[n]='\0'
for(int i=0;i<10;i++){
number[0]=i+'0';
helper(0,n,number);
}
}
void helper(int index,int length,char* [] number){
if(index==length-1){
PrintNum(number)
return;//递归结束;
}
for(int i=0;i<10;i++){
number[index+1]=i+'0';
helper(index+1,length,number);
}
}
public void printNum(char[] number){
boolean isBeginning0=true;
int length=number.length;
for(int i=0;i<length;i++){
if(isBeginning0&&number[i]!='0')
isBeginning=false;
if(!isBeginning0){
System.out.println(number[i]);
}
}
}