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

这个题目主要考虑的是大整数越界的问题,下面采用了两种方法,一种是用数组模拟大整数相加,另一种是用递归的方法,递归的方法代码简单明了,但是就是效率比较低。

下面是我在自己的linux虚拟机上跑出来的5位数所用的时间,即是输出1到99999,非递归的方法时间为:

real    0m14.282s
user    0m0.286s
sys     0m2.157s

递归的方法时间为:

real    0m23.573s
user    0m0.714s
sys     0m3.413s

代码:

#include <iostream>
#include <list>
using namespace std;

void add(int *m, int *n, int len); //m+n的值,结果放在m中
bool isEnd(int *m);
void print1ToMax_1(int n);//非递归
void printNum(list<int> result);
void print1ToMax_2(list<int> &result, int n);//递归

int main()
{
        //print1ToMax_1(5);
        list<int> result;
        print1ToMax_2(result, 5);
        return 0;
}

//------------解法一-------------
bool isEnd(int *m)
{
        if(m[0] == 1)
                return true;
        else
                return false;
}
void add(int *m, int *n, int len)
{
        for(int i=0; i<len; i++)
                m[i] += n[i];
        for(int i=len-1; i>=1; i--)
        {
                if(m[i] >= 10)
                {
                        m[i] /= 10;
                        m[i-1] += 1;
                }
        }
}
void print1ToMax_1(int n)
{
        int *num = new int[n+1]();
        int *num_1 = new int[n+1]();
        num_1[n] = 1;
        while(!isEnd(num))
        {
                bool flag = false;
                for(int i=0; i<n+1; i++)
                {
                        if(flag == false && num[i] != 0)
                                flag = true;
                        if(flag)
                                cout<<num[i];
                }
                cout<<endl;
                add(num, num_1, n+1);
        }
        delete num;
        delete num_1;
}
//------------解法二-------------
void printNum(list<int> result)
{
        bool flag = false;
        for(list<int>::const_iterator iter = result.begin(); iter != result.end(); ++iter)
        {
                if(flag == false && *iter != 0)
                        flag = true;
                if(flag)
                        cout<<*iter;
        }
        cout<<endl;
}

void print1ToMax_2(list<int> &result, int n)
{
        if(result.size() == n)
        {
                printNum(result);
                return;
        }
        for(int i=0; i<=9; i++)
        {
                result.push_back(i);
                print1ToMax_2(result, n);
                result.pop_back();
        }
}


 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐