输出1到最大的N位数

来源:互联网 发布:java计算cpu使用率 编辑:程序博客网 时间:2024/05/16 10:30

输入数字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();        }}


 

原创粉丝点击