剑指offer

17_打印从1到最大的n位数

2020-05-19  本文已影响0人  是新来的啊强呀

要求:打印从1到最大的n位数。如打印9,0=>1=>2=>3=>4=>5=>6=>7=>8=>9。
思路:由于当输入n很大时,使用int或long都会溢出。
比如,int和long的最大位数分别为2^{31}-12^{64}-1
需要考虑大数问题可以借用字符串或数组表示大数。首先把字符串中的每一个数字初始化为'0',然后每一次为字符串表示的数加1,再打印出来。

因此,我们只需要做两件事:

  • 一是在字符串表示的数字上模拟加法:
    我们首先设置是否溢出标识,是否进位标识,以及取得字符数组长度,遍历这个字符数组,在末尾进行+1操作,如果末尾字符在+1后变为不小于10的数字,我们将末尾减去10加上‘0’字符赋值为末位,进位标识设置为1,在循环次位时+1,然后再判断是否为不小于10,是的话重复上面的步骤。直到判断高位是不是不小于10,是的话字符数组溢出;如果末尾字符在+1后是小于10的数字,直接加上‘0’赋值给末尾,跳出当前循环,返回没有溢出。
  • 二是把字符串表示的数字打印出来。注意在打印时,数字排在前面的0不打印。
public class L17_Print1ToMaxOfNumber {
    public static void Print1ToMaxOfNumber(int n){
        if(n <= 0){
            System.out.println("输入的n没有意义");
            return;
        }
        // 先创建一个字符数组,长度为n, 并赋值0
        char number[] = new char[n];
        for (int i = 0; i < number.length; i++) {
            number[i]='0';
        }
        while(!incrementNumber(number)){ //如果大数自加,直到自溢退出
            printNumber(number); //打印大数
        }
    }

    /**
     * 在字符串表示的数字上模拟加法
     * @param number
     * @return
     */
    // 我们首先设置是否溢出标识,是否进位标识,以及取得字符数组长度,遍历这个字符数组,在末尾进行+1操作,
    // 如果末尾字符在+1后变为不小于10的数字,我们将末尾减去10加上‘0’字符赋值为末位,进位标识设置为1,在循环次位时+1,
    // 然后再判断是否为不小于10,是的话重复上面的步骤。直到判断高位是不是不小于10,是的话字符数组溢出;
    // 如果末尾字符在+1后是小于10的数字,直接加上‘0’赋值给末尾,跳出当前循环,返回没有溢出。

    private static boolean incrementNumber(char[] number) {
        boolean isOverFlow = false;  // 判断是否溢出
        int nTakeOver = 0;  // 判断是否进位
        int nLength = number.length;  // 几位
        for(int i=nLength-1;i>=0;i--){  // 从右往左,个位开始
            int sum = number[i]-'0'+nTakeOver;  // 将字符转换为对应的数字,并加上进位
            if(i==nLength-1){  // 如果是末尾个位开始,加一
                sum++;
            }
            if(sum>=10){  // 此时大于等于10
                if(i==0){  // 若成立,表示溢出
                    isOverFlow = true;
                }else{
                    sum -=10;  // 归零
                    nTakeOver = 1;  // 进一位
                    number[i] = (char)('0'+sum);
                }
            }else{
                number[i] = (char)('0'+sum);  // 数字转换为字符串
                break;
            }
        }
        return isOverFlow;
    }

    /**
     * 在打印时,数字排在前面的0不打印。
     * @param number
     */
    private static void printNumber(char[] number) {
        boolean isBeginning0 = true;
        for(int i=0; i<number.length;i++){  // 从头到尾进行判断该位值是否为'0'
            if(isBeginning0 && number[i] != '0'){
                isBeginning0 = false;
            }
            if(!isBeginning0){
                System.out.print(number[i]);
            }
        }
        System.out.println();

    }
    public static void main(String[] args) {
        char[] a = {'1','0'};
        String b = "dsfasdf";
        int num = a[0]-'0'; // 将字符转换为数字

        System.out.println(num);
        System.out.println(b.charAt(b.length()-1));
        System.out.println("******");
        Print1ToMaxOfNumber(2);
    }
}

上一篇下一篇

猜你喜欢

热点阅读