美文网首页剑指offer
17_打印从1到最大的n位数

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

作者: 是新来的啊强呀 | 来源:发表于2020-05-19 22:09 被阅读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);
        }
    }
    
    

    相关文章

      网友评论

        本文标题:17_打印从1到最大的n位数

        本文链接:https://www.haomeiwen.com/subject/veiiohtx.html