首页 > 其他 > 详细

打印从1到最大的n位数

时间:2019-10-13 19:19:15      阅读:124      评论:0      收藏:0      [点我收藏+]

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

思路

先找出最大值,然后遍历输出

public void print1ToMaxOfNDights1s(int n) {
    int number = 1;
    int i = 0;
    while (i++ < n) {
        number *= 10;
    }
    for (i = 1; i < number; i++) {
        System.out.print(i + " ");
    }
    System.out.println();
}

陷阱:n过大时是大数问题,不能简单用int或者long数据输出,需要采用字符串或者数组表达大数。

  1. 采用字符串模拟加法
//解决1 模拟加法
public void print1ToMaxOfNDigits02(int n) {
    if (n < 0) {
        return;
    }
    char[] number = new char[n];
    for (int k = 0; k < number.length; k++) {
        number[k] = '0';
    }
    while (!increment(number)) {//模拟加法
        printCharNumber(number);//打印
    }
}

private void printCharNumber(char[] number) {
    boolean isBeginning0 = true;
    for (int i = 0; i < number.length; i++) {
        if (isBeginning0 && (number[i] - '0') != 0) {//忽略前面的0
            isBeginning0 = false;
        }
        if (!isBeginning0) {
             System.out.print(number[i] - '0');
        }
    }
    System.out.println();
}

//对字符串进行加1操作,当number达到最大值后返回为true
//低位加1 到10进位
private boolean increment(char[] number) {
    int nTackOver = 0;//进位
    for (int i = number.length - 1; i >= 0; i--) {
        int nSum = (number[i] - '0') + nTackOver;
        // number[i]-'0'是把char转化为int,nTakeOver代表进位
        if (i == number.length - 1) {
            nSum++;
        }
        if (nSum >= 10) {
            if (i == 0) {
                return true;//超出范围
            }
            nTackOver = 1;
            nSum -= 10;
            number[i] = (char) (nSum + '0');
        } else {
            number[i] = (char) (nSum + '0');
            break;//高位不变跳出循环
        }
    }
    return false;
}

打印从1到最大的n位数

原文:https://www.cnblogs.com/aiguozou/p/11667743.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!