打印1到最大的n位数

打印1到最大的n位数

输入3,就打印1-999的所有数

思路一:

找到10的n次方,利用for循环打印从1-10^n

但是这样是不行的,如果数字一旦超过long 就会溢出

思路二:

用一个n位的字数组来模拟十进制加法,实现进位;
数组是a[0],a[1],a[2]…index 0 用来表示个位,
所以打印的时候得从数组的后面打。

public static void max(int n){
        char str[] = new char[n];
        for(int i = 0;i<n;i++){//初始化字符数组
            str[i] = '0';
        }
        for(int i = n-1;i>=0;i--) {//开始计算
        
            while(str[i]!='9'){
               int m =0;
               str[m]++;
               while(str[m]>'9'&&m<n-1){
                   str[m]='0';
                   str[m+1]++;
                    m++;
               }
               print(str);
            }

        }

    }

    private static void print(char[] str) {
        int m =str.length-1;
        while(str[m]=='0'){
            m--;
        }
        for(int i = m;i>=0;i--){
            System.out.print(str[i]);
        }
        System.out.println();

    }
    public static void main(String[] args) {
        // new Max().printToMax1(1);//大数就越界
        max(3);

    }

特别要强调一下以下代码

 A: for(int i = n-1;i>=0;i--) {//开始计算
        
          B:  while(str[i]!='9'){
               int m =0;
               str[m]++;
            C:   while(str[m]>'9'&&m<n-1){
                   str[m]='0';
                   str[m+1]++;
                    m++;
               }
               print(str);
            }

A处的for循环控制的是打印最高为九的这些数
举个例子 n = 3 时,i = n-1开始第一次for循环打印的就是1~900
如果你把循环条件改为 for(int i = n-1;i>=n-1;i–) 只循环一次
就会发现打印到 900 他就不打印了,因为Bwhile循环控制了加法的终点,只要str【i】==9就开始下一个for循环,
下一次打印的就是1~990,其实就是打了99个数,

下面的whileC 设计的很巧妙,他是进位功能,那个最后的m++看似没有用,因为m++完了上面又m = 0;实则有用
如果数字为499,这样个位进位,进入C:while 之后m++,十位也要进C:while 这样就进位了,如果两个相邻的位数前一个为9
或者都没有进位的趋势短期内,那个m++就会误以为没有用,理解起来很困难

这样就完成了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值