输出1到最大的N位数

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值