大数问题-打印1到最大的n位数

来源:互联网 发布:好牧人12网络牧养中心 编辑:程序博客网 时间:2024/06/09 03:20

问题描述

输入数字n,按顺序打印出从0到最大的n位十进制数。比如输入4,则需要输出0,,1,2,3,···, 9999

思路

需要注意两点:

  1. 直接使用int或long类型,当n比较大时会溢出
  2. 如何快速的判断出到达了最大的n位数

为解决第一点,我们需要使用字符串模拟加法,这样就不会溢出。第二点快速判断到达最大n位数,只需要我们对每次进位位进行判断,看进位位是否是最高位,如果是表示已经到了最大n位数。

代码实现

思路一:直接使用字符串模拟每次+1操作

public class Main {    public static void main(String[] args) {        int n=4;        char[] ch = new char[n];        for(int i=0;i<n;i++){            ch[i] = '0';        }        add_1(ch);    }    /**     * 模拟加法     */    public static void add_1(char[] ch){        // 当到达最大n位数时跳出        while(true){            // 个位进行0-9依次遍历            for(int i=0;i<10;i++){                ch[ch.length-1] = (char)('0'+i);                print(ch);            }            for(int i=ch.length-2;i>=0;i--){                if(ch[i]!='9'){                    // 进位位加1                    ch[i] = (char)(ch[i]+1);                    // 进位结束跳出                    break;                }else{                    // 进位位为9,继续进位,当前进位位变为0                    ch[i] = '0';                    if(i==0)                        return;                }            }        }    }    // 打印函数,从第一个非零位开始打印    public static void print(char[] ch){        boolean flag = false;        for(int i=0;i<ch.length;i++){            if(flag){                System.out.print(ch[i]);                continue;            }            if(ch[i]!='0'){                flag = true;                System.out.print(ch[i]);            }            if(!flag && i==ch.length-1){                System.out.print(ch[i]);            }        }        System.out.println();    }}

思路二:使用全排列思路,每位相当于有10种排列可能(0~9)。
借鉴全排列实现如下

public class Main4 {    public static void main(String[] args) {        char[] ch = new char[4];        for(int i=0;i<ch.length;i++){            ch[i] = '0';        }        array(ch, 0);    }    public static void array(char[] ch,int current){        if(current==ch.length-1){            for(int i=0;i<10;i++){                ch[current] = (char)(i+'0');                print(ch);            }        }else{            for(int i=0;i<10;i++){                ch[current] = (char)(i+'0');                array(ch, current+1);            }        }    }    // 打印函数    public static void print(char[] ch){        boolean flag = false;        for(int i=0;i<ch.length;i++){            if(ch[i]!='0')                flag = true;            if(flag)                System.out.print(ch[i]);        }        if(flag)            System.out.println();    }}
原创粉丝点击