题目: 输入2 则输出1~99 输入3 则输出1~999
思路: 属于大数问题,因为输出的n一大,则特别容易出现溢出问题,即超出long long可表示的范围。
所以用一般的思路: 根据n的位数,先求出最大的值,接着遍历。 是不符合要求的
新思路: 将n位的每一位看成是一个字符, 输出的数字只是n位字符的全排列。 比如数字34,只是理解为 char num[3] = "34";
代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void PrintfOut(char *strnum) //最高位的‘0’不打印出来
{
int len = strlen(strnum);
bool iszero = true;
for (int i = 0; i < len; ++i)
{
if (iszero && strnum[i]!='0')
{
iszero = false;
}
if (!iszero)
{
cout << strnum[i];
}
}
if (!iszero)
cout << '\t';
}
void Func2(char *strnum, int length, int index)
{
if (index == length-1) //递归终止条件
{
PrintfOut(strnum);
return;
}
for (int i = 0; i < 10; ++i)
{
strnum[index+1] = i + '0';
Func2(strnum, length, index+1);
}
}
void Func(int n)
{
char *strnum = new char[n+1];
memset(strnum, '0', n+1);
strnum[n] = '\0';
for (int i = 0; i < 10; ++i)
{
strnum[0] = i + '0'; //最高位从'0'到'9'
Func2(strnum, n, 0);
}
}
int main()
{
int num;
cin >> num;
Func(num);
system("pause");
}