题目:输入数字n,按顺序打印出从1到n位最大十进数的数值。比如输入3,则打印出1、2、3一直到最大三位数即999。
基本思路:
解法一:用数组存储大数,首先初始化为0,然后为每一个数组元素表示的数字加1,再打印出来。因此我们只需要做两个事情:一是在数组表达的数字上模拟加法;二是:把数组表达的数字打印出来;
解法二:如果我们在数字前面补0,就会发现n位所有十进制其实就是n个从0到9的全排列。也就是说,我们把数组的每一位都从0到9排列一遍,就得到所有的十进制数。只是在打印的时候,排在前面的0就不打印出来罢了。
解法一Java实现:
public class Print1ToMax {
private void Print1ToMaxOfDigits(int n) {
if(n<=0)
return;
int[] number=new int[n];
for(int i=0;i<number.length;i++) {//初始化数组为0
number[i]=0;
}
while(!Increment(number)) {//当没溢出,则打印
PrintNumber(number);
}
}
private void PrintNumber(int[] number) {
// TODO Auto-generated method stub
int len=number.length;
boolean is0=true;//是0为真
for(int i=0;i<len;i++) {
if(is0&&number[i]!=0) {//非0,设置is0=false
is0=false;
}
if(!is0) {
System.out.println(number[i]);
}
}
System.out.println("\n");//换行
}
private boolean Increment(int[] number) {
// TODO Auto-generated method stub
boolean isOverflow=false;//最后一位标志
int nTakeOver=0;//进位+1
int len=number.length;
for(int i=len-1;i>=0;i--) {
int nSum=number[i]+nTakeOver;
if(i==len-1)//大数最后一位+1
nSum++;
if(nSum>=10) {
if(i==0) {//如果是第一位有进位则溢出
isOverflow=true;
}
else {//不是,则处理进位,进位标志=1
nSum-=10;
nTakeOver=1;
number[i]+=nSum;
}
}else {//没进位
number[i]+=nSum;
break;
}
}
return isOverflow;
}
}
解法二Java实现:
public class Print1ToMax{
void Print1ToMaxDigits(int n) {
if(n<=0)
return;
int[] number= new int[n];
for(int i=0;i<number.length;i++) {//初始化数组
number[i]=0;
}
for(int i=0;i<10;i++) {
number[0]=i;
Print1ToMaxRecursively(number,n,0);//从第一位为0开始
}
}
private void Print1ToMaxRecursively(int[] number, int length, int index) {
// TODO Auto-generated method stub
if(index==length-1) {
PrintNumber(number);
}
for(int i=0;i<10;i++) {
number[index+1]=i;
Print1ToMaxRecursively(number,length,index+1);//开始递归
}
}
private void PrintNumber(int[] number) {
// TODO Auto-generated method stub
int len=number.length;
boolean is0=true;//是0为真
for(int i=0;i<len;i++) {
if(is0&&number[i]!=0) {//非0,设置is0=false
is0=false;
}
if(!is0) {
System.out.println(number[i]);
}
}
System.out.println("\n");//换行
}
}