您的位置:首页 > 其它

输出1到最大的N位数

2012-08-26 16:45 239 查看
输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的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
= 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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: