[剑指Offer]:打印从1到最大的 n 位数(解法详解~~)

95 阅读1分钟

文章目录


题目描述

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

题解思路

  1. 不假思索的解法

代码实现:

class Solution {
public:
    vector<int> printNumbers(int n) {
        int max = pow(10, n)-1;
        vector<int> v(max);
        for(int i = 0; i < max; i++) v[i] = i+1;
        return v;
    }
};

初看之下好像没有问题,但是其并没有考虑大数问题,有可能即使用整型(int)或长整型(long)都会溢出。

  1. 数组模拟运算的解法

最常用也是最容易的方法是用字符串或者数组表达大数。该算法的步骤如下:

  • Step1.把数组 / 字符串中的每一个数字都初始化为’0’
  • Step2.每一次为数组 / 字符串表示的数字加1,再打印出来
  • Step3.打印的时候,需要注意将数字前的0去掉!!

代码实现:

bool increment(vector<char>& v){
    bool flag = false;
    int n = 0;
    int len = v.size();
    for(int i = len-1; i >= 0; --i){
        int sum = v[i]-'0'+n;
        if(i == len-1) sum++;
        if(sum >= 10){
            if(i == 0) flag = true;
            else{
                sum -= 10;
                n = 1;
                v[i] = '0'+sum;
            }
        }
        else{
            v[i] = '0'+sum;
            break;
        }
    }
    return flag;
}

void CoutNum(vector<char>& v){
    bool flag = true;
    int len = v.size();
    for(int i = 0; i < len; ++i){
        if(flag && v[i] != '0') flag = false;
        if(!flag) cout << v[i];
    }
    cout << endl;
}

int main(){
    int num;
    while(cin >> num){ 
        if(num <= 0){
            cout << "输入有问题,请重新输入" << endl;
            continue;
        }
        vector<char> v(num, '0');
        while(!increment(v)){
            CoutNum(v);
        }
    }
    return 0;
}

代码生成图:

在这里插入图片描述

  1. 递归(数字排列)

如果可以在数字前面补0,就可以发现n位所有十进制其实就是n个从0到9的全排列 ~~~

代码实现:

void CoutNum(vector<char>& v){
    bool flag = true;
    int len = v.size();
    for(int i = 0; i < len; ++i){
        if(flag && v[i] != '0') flag = false;
        if(!flag) cout << v[i];
    }
    cout << ' ';
}

void CoutDigitNum(vector<char> v, int len, int index){
    if(index == len-1){
        CoutNum(v);
        return;
    }
    for(int i = 0; i < 10; ++i){
        v[index+1] = i+'0';
        CoutDigitNum(v, len, index+1);
    }
}

int main(){
    int num;
    while(cin >> num){ 
        if(num <= 0){
            cout << "输入有问题,请重新输入" << endl;
            continue;
        }
        vector<char> v(num, '0');
        for(int i = 0; i < 10; ++i){
            v[0] = i+'0';
            CoutDigitNum(v, num, 0);
        }
    }
    return 0;
}

如有不同见解,欢迎留言讨论~~~