您的位置:首页 > 其它

打印1到最大的n位数:大数问题,全排列实现

2017-06-27 11:44 288 查看
题目:

输入数字n,按顺序打印出从1到最大的n位十进制数。比如,输入3,则打印出1,2,3,…..,一直到最大的3位数即999。

剑指offer上的题目,典型的大数加法问题,无论是int还是long 类型都可能会溢出。所以在解决大数问题时,通常是使用字符串或者数组实现其功能。

思考:

字符串String在这里需要不断做改变,大家都知道String是不可变的,所以每次都需要新建String对象。因此,采用数组方式,字符 int均可;

剑指offer上代码对全排列表述重复,再次做小修改。

//最重要递归函数实现全排列
public static void Print_1ToMax_Of_Ndigits(int[] number,
int length,int index)
{
//检查当前是否 溢出,溢出代表排列已满,即最后一位已经赋值,直接将当前数字number打印即可;
if(index ==length){
PrintNumber(number);
return;
}
for(int i=0;i<10;i++){
number[index]=i;
PrintMaxOfNdigits(number, length, index+1);
}
System.out.println("");//最高位变一次,输出一次空行
}

//打印字符数组number
public static void PrintNumber(int[] number){
boolean isBeginning0=true;
for(int i=0;i<number.length;i++){
if(isBeginning0&&number[i]!=0)
isBeginning0=false;
if(!isBeginning0){//从第一个非0数字打印
System.out.print(number[i]);
}
}
System.out.print("\t");//一个数字输出完毕
}
public static void PrintNumber(int n){
if(n<=0)
return;
int[] number = new int
;
Print_1ToMax_Of_Ndigits(number, n, 0);
}


全排列,算法中实现时就是在循环中指定第一个数字后,再去for指定第二个,第三个;在这期间需要去判断,指定的位数是否已满,已满则直接将这个拼好的 int[] 输出即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: