您的位置:首页 > 其它

打印1到最大的n位数

2016-05-16 13:09 288 查看
//输入数字n,按顺序打印出从1最大的n位十进制数。
//比如输入3,则打印1、2、3一直到最大的3位数即999.

#include "iostream"

#include "string"
#include "vector"

using namespace std;

//用一个string做加法器
void stringAdd(string &str)
{
if (str.empty())
{
str = "1";
return;
}
int len = static_cast<int>(str.size());
for (int i = len - 1; i >= 0; i--)
{
if (str[i] == '9')
str[i] = '0';
else
{
str[i]++;
return;
}
}
str = "1" + str;
return;
}
void print1ToMaxOfNDigits_1_str(int n)
{
if (n <= 0)
return;
string max = string(n, '9');
string str("1");
while (str != max)
{
cout << str << ",";
stringAdd(str);
}
cout << str << endl;
}

//做一个vector的加法器
void vectorAdd(vector<int> &vec)
{
if (vec.empty())
{
vec.push_back(1);
return;
}

for (size_t i = 0; i < vec.size(); i++) //index大小正比位数高低
{
if ((vec[i]) == 9)
vec[i] = 0;
else
{
vec[i] += 1;
return;
}
}
vec.push_back(1);
return;
}

void printVecAsNum(const vector<int> &num)
{
for (int i = static_cast<int>(num.size()) - 1; i >= 0; i--)
{
cout << num[i];
}
}
bool MaxofNDigits(const vector<int> &vec, int n)
{
if (vec.size() < n)
return false;
for (size_t i = 0; i < vec.size(); i++)
{
if (vec[i] != 9)
return false;
}
return true;
}
void print1ToMaxOfNDigits_1_vec(int n)
{
if (n <= 0)
return;
vector<int> num;
vectorAdd(num);
while (!MaxofNDigits(num, n))
{
printVecAsNum(num);
cout << ",";
vectorAdd(num);
}
printVecAsNum(num);
cout << endl;
}

//转化成全排列问题
void printNum(char* num)
{
int len = strlen(num);
int i = 0;
while (num[i] == '0')
i++;
while (i < len)
{
printf("%c", num[i]);
i++;
}
printf("\t"); //这里格式就没用“,”隔开了,更简单了。
}
void print1ToMaxOfNDigitsRecursively(char* num, int len, int index)
{
if (index == len - 1)
{
printNum(num);
return;
}
for (int i = 0; i < 10; i++)
{
num[index + 1] = i + '0';
print1ToMaxOfNDigitsRecursively(num, len, index + 1);
}
}
void print1ToMaxOfNDigits_1_permutation(int n)
{
if (n <= 0)
return;
char* num = new char[n + 1];
num
= '\0';

for (int i = 0; i < 10; i++)
{
num[0] = i + '0';
print1ToMaxOfNDigitsRecursively(num, n, 0);
}
delete[] num;
}

void test()
{
print1ToMaxOfNDigits_1_str(-1);
print1ToMaxOfNDigits_1_str(0);
print1ToMaxOfNDigits_1_permutation(2);
print1ToMaxOfNDigits_1_str(5);
}

int main()
{
test();
return 0;
}

三种方法,个人更倾向于string的方法。(关于输出格式,可以根据需求更改。)

这里主要是考虑大数问题,如果对效率要求高,可以甚至阈值,当小于某个数max(int)-1,直接递增输出。大于之后才用其他的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: