一、一般解法(没有考虑到大数问题)
void PrintToMaxOfNDigits(int n)
{
int number = 1;
while (n--)
number *= 10;
for (int i = 1;i < number;++i)
std::cout << i;
std::cout << " ";
}
二、利用字符串数组解决大数问题
#include<iostream>
class PrintToMaxOfNDigits
{
char* number;
int nLength;
public:
PrintToMaxOfNDigits(int n);
~PrintToMaxOfNDigits() { delete[] number; }
private:
bool Increment();
void PrintNumber();
};
void PrintToMaxOfNDigits::PrintNumber()
{
bool isNumber = false;//作标记,标记第一次出现非0数字
for (int i = 0;i < nLength;++i)
{
if (number[i] != '0' && !isNumber)
{
isNumber = true;
}
if (isNumber)
{
std::cout << number[i];
}
}
std::cout << " ";
}
bool PrintToMaxOfNDigits::Increment()
{
bool isOverflow = false;
int takeOver = 0;
for (int i = nLength - 1;i >= 0;--i)
{
int oSum = number[i] - '0' + takeOver;
if (i == nLength - 1)
{
oSum++;
}
if (oSum >= 10)//如果加1之后大于等于10需要进位
{
if (i == 0)//如果是最高位进位,则结束
isOverflow = true;
else
{
oSum -= 10;
takeOver = 1;
number[i] = '0' + oSum;
}
}
else//不大于等于10,则直接加上结束
{
number[i] = '0' + oSum;
break;
}
}
return isOverflow;
}
PrintToMaxOfNDigits::PrintToMaxOfNDigits(int n)
{
if (n <= 0)return;
number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
nLength = strlen(number);
while (!Increment())
{
PrintNumber();
}
}
int main(int argc,char*argv[])
{
PrintToMaxOfNDigits B(2);
std::cin.get();
return 0;
}
三、运用递归进行排列组合计算输出
#include<iostream>
class PrintToMaxOfNDigits
{
char* number;
public:
PrintToMaxOfNDigits(int n);
~PrintToMaxOfNDigits() { delete[] number; }
private:
void PrintNumber();
void PrintToMaxOfNDigitsRecursively(int n, int index);
};
void PrintToMaxOfNDigits::PrintNumber()
{//打印字符串数组
bool isNumber = false;
for (int i = 0;i < strlen(number);++i)
{
if (number[i] != '0' && !isNumber)
isNumber = true;
if (isNumber)
std::cout << number[i];
}
std::cout << " ";
}
void PrintToMaxOfNDigits::PrintToMaxOfNDigitsRecursively(int n, int index)
{
if (index == n - 1)
{//如果是个位数则将该数输出
PrintNumber();
return;
}
for (int i = 0;i < 10;++i)
{//每一位进行递归
number[index + 1] = '0' + i;
PrintToMaxOfNDigitsRecursively(n, index + 1);
}
}
PrintToMaxOfNDigits::PrintToMaxOfNDigits(int n)
{
if (n <= 0)return;
number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
for (int i = 0;i < 10;++i)
{//首位数字组合
number[0] = '0' + i;
//首位数字之后的所有位通过递归完成
PrintToMaxOfNDigitsRecursively(n, 0);
}
}
int main(int argc, char* arv[])
{
PrintToMaxOfNDigits B(2);
std::cin.get();
return 0;
}