您的位置:首页 > 其它

输出1到最大n位数之间的所有数

2014-03-18 10:08 232 查看
[b]比如[/b]

n = 2

那么从1一直输出到99

[b]分析[/b]

直接输出,遇到大数时肯定有问题,比如n=100,存储100位的数据类型不存在。

可以利用数组来存储大数,比如n=100,可以开辟个数组 char a[101]

[b]思路一[/b]

模拟现实中的技术方式,逢九进一

参考代码

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

bool minuxOne(char *a, int *end_index, int size)
{
if((*end_index == size - 1 && a[size - 1] == '0') || *end_index < 0 || *end_index >= size)
return false;
int tmp = size - 2;
if(a[size - 1] != '0')
--a[size -1];
else
{
a[size - 1] = '9';
while(1)
{
if(a[tmp] == '0')
{
a[tmp] = '9';
--tmp;
}
else
{
--a[tmp];
break;
}
}
if(a[*end_index] == '0')
++*end_index;
}
return true;
}

bool printNum(const int size)
{
if(size < 0)
return false;
char *a = new char[size];
memset(a, '9', size);
int end_index = 0;
while(1)
{
if(end_index == size - 1 && a[size - 1] == '0')
break;
for(int i = 0; i < size; ++i)
{
if(end_index > i && a[i] == '0' )
continue;
cout << a[i];
}
cout << "\t";
if(!minuxOne(a, &end_index, size))
break;
}
delete []a;
return true;
}

int main()
{
int size = 5;
printNum(size);
}


结果



[b]思路二[/b]

本质可以看作是全排列,只是前边的0别输出

#include <iostream>
using namespace std;

bool print1ToMaxN(const int n);
bool print1ToMaxNRecursion(char *a, int size, int index);
bool printNum(char *a, int size);
int main()
{
int size = 3;
print1ToMaxN(size);
}

bool print1ToMaxN(const int size)
{
if(size <= 0)
return false;
char *a = new char[size];
for(int i = 0; i <= 9; ++i)
{
a[0] = i + '0';
print1ToMaxNRecursion(a, size, 1);
}
return true;
}

bool print1ToMaxNRecursion(char *a, int size, int index)
{
if(size <= 0 || index < 0)
return false;
if(index == size)
{
printNum(a, size);
return true;
}
for(int i = 0; i <= 9; ++i)
{
a[index] = i + '0';
print1ToMaxNRecursion(a, size, index + 1);
}
}

bool printNum(char *a, int size)
{
if(size <= 0)
return false;
bool IsPre0 = true;
for(int i = 0; i < size; ++i)
{
if(IsPre0 && a[i] != '0')
IsPre0 = false;
if(!IsPre0)
cout << a[i];
}
cout << "\t";
}


结果



分析

1. 输出问题:一开始为0不要输出,这需要输出时判断下

2. 递归全排列的本质原理:每一位字符0~0都有可能,在方位本位的时候递归遍历下一位。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐