打印从1到最大的n位数
题目描述
输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的三位数999。
思路分析
方法一:首先会想到直接求出最大的n位十进制数,但是这题主要目的是在于解决大数问题,所以这种做法无法解决n位数溢出的问题。代码如下:
public void print1(int n){
if(n<0)return;
int i=0,num=1;
while(i++<n){
num*=10;
}
for(int j=0;j<num;j++){
System.out.println(j);
}
}
方法二:为了解决大数问题,就会想到用字符串模拟数字运算。大致思路:定义一个n位字符数组(初始化元素都为‘0’),然后逐渐增一并打印,直至不能再增加。代码如下:
public void print2(int n){
if(n<0)return;
char[] chs=new char[n];
Arrays.fill(chs,'0');
while(!increment(chs)){
printNum(chs);
}
}
public boolean increment(char[] chs){
boolean overflow=false;
int takeflow=0;
for(int i=chs.length-1;i>=0;i--){
int nSum=chs[i]-'0'+takeflow;
if(i==chs.length-1)nSum++;
if(nSum>=10){
if(i==0){
overflow=true;
}else{
takeover=1;
nSum-=10;
chs[i]=(char)('0'+nSum);
}
}else{
chs[i]=(char)('0'+nSum);
break;
}
}
return overflow;
}
public void printNum(char[] chs){
for(int i=0;i<chs.length;i++){
if(chs[i]!='0'){
char[] resChs=Arrays.copyOfRange(chs,i,chs.length);
System.out.println(new String(resChs));
break;
}
}
}
方法三:方法二较为直观,代码量大。现在换一种思路:n位的十进制数其实就是n个从0到9的全排列,全排列可以用递归实现。代码如下:
public void print3(int n){
if(n<0)return;
char[] chs=new char[n];
for(int i=0;i<10;i++){
chs[0]=(char)('0'+i);
fullPermutation(chs,0);
}
}
public void fullPermutation(char[] chs,int index){
if(index==chs.length){
printNum(chs);
return;
}
for(int i=0;i<10;i++){
chs[index+1]=(char)('0'+i);
fullPermutation(chs,index+1;)
}
}