代码:
#include <iostream>
using namespace std;
//打印数字
void printNumber(char* number) //前面为0的数字不打印
{
int len = strlen(number);
int i = 0;
while (number[i] == '0')
i++;
for (int j = i; j < len; j++)
cout << number[j];
cout << "\t";
}
//
bool numberIncrease(char* number)
{
bool isOverflow = false;
int digit = 0; //保存某位上的数字
int carry = 0; //进位
int len = strlen(number);
for (int i = len - 1; i >= 0; --i) //从最低位开始处理
{
digit = number[i] - '0' + carry;
if (i == len - 1)
digit++;
if (digit >= 10)
{
if (i == 0) //溢出
isOverflow = true;
else
{
digit -= 10;
carry = 1;
number[i] = digit + '0';
}
}
else
{
number[i] = digit + '0';
break; //跳出循环
}
}
return isOverflow;
}
//方法一
//为了处理大数(最大的n位数无论是int型还是long型都可能溢出)
//用字符串模拟数字
void Print1ToMaxOfNdigits(int n)
{
char *number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
while (!numberIncrease(number))
{
printNumber(number);
}
delete[] number;
}
/*-------------------------------------------------------------------------*/
void printRecursive(char* number, int len, int index)
{
if (index == len - 1)
{
printNumber(number);
return;
}
for (int i = 0; i < 10; ++i)
{
number[index + 1] = i + '0';
printRecursive(number, len, index + 1);
}
}
//递归产生全排列(每一位0~9)
void Print1ToMaxOfNdigits_2(int n)
{
char *number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
for (int i = 0; i < 10; i++)
{
number[0] = i + '0';
printRecursive(number, n, 0);
}
delete[] number;
}
int main()
{
int n = 2;
cout << "使用字符数组: " << endl;
Print1ToMaxOfNdigits(n);
cout << endl<<endl;
cout << "递归(全排列): " <<endl;
Print1ToMaxOfNdigits_2(n);
cout << endl;
system("pause");
return 0;
}
测试: