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

来源:互联网 发布:怎么关掉电脑445端口 编辑:程序博客网 时间:2024/06/09 07:25

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

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

  1. 字符串String在这里需要不断做改变,大家都知道String是不可变的,所以每次都需要新建String对象。因此,采用数组方式,字符 int均可;
  2. 剑指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[n];        Print_1ToMax_Of_Ndigits(number, n, 0);    }

全排列,算法中实现时就是在循环中指定第一个数字后,再去for指定第二个,第三个;在这期间需要去判断,指定的位数是否已满,已满则直接将这个拼好的 int[] 输出即可。