【剑指offer】12.打印1到最大的n位数

题目描述

输入数字n,按照顺序打印出从1到最大的n位十进制数。

样例

输入

2

输出
1~9之间的所有整数

思路

《剑指offer》P94
很容易想到定义一个整型数字,依次加1并输出,但是这种情况,当输入的n很大时会造成溢出。
因此,考虑用字符串来保存所有位上的数字,然后模拟加法。
注意的问题:

  • 进位
  • 到达最高位时的处理
  • 输出时,不输出高位上的0,如值为01则输出1

code

非递归

class Solution {
public:
    void Print1ToMaxOfN(int n) {
        if (n < 0)
            return;
        // 构造一个字符串保存数字
        char *number = new char[n + 1];
        memset(number, '0', n);
        number[n] = '\0';
        while (!Increment(number))
            PrintNumber(number);
    }

    bool Increment(char *number) {
        bool isOverFlow = false; // 记录是否溢出
        int nTakeOver = 0;
        int nLength = strlen(number);
        for (int i = nLength - 1; i >= 0; i --) {
            int nSum = number[i] - '0' + nTakeOver; // 转为数字,加上进位
            // 如果当前在个位,则加一
            if (i == nLength - 1)
                nSum ++;

            // 判断是否有进位
            if (nSum >= 10) {
                // 进位已经溢出
                if (i == 0) {
                    isOverFlow = true;
                    break;
                }
                nTakeOver = nSum/10; // 保存进位
                nSum -= 10; // 保存当前值
                number[i] = nSum + '0'; // 转换成字符形式
            }
            else {
                number[i] = nSum + '0'; // 转换成字符形式
                break;
            }
        }
        return isOverFlow;
    }

    void PrintNumber(char *number) {
        bool printZero = false;
        int nLen = strlen(number);
        for (int i = 0; i < nLen; i ++) {
            if (number[i] > '0' && number[i] <= '9'){
                cout << number[i];
                printZero = true;
            }
            if (number[i] == '0' && printZero)
                cout << number[i];
        }
        cout << endl;
    }


};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值