打印从1到最大的n位数
/*
* 输入数字n,按照顺序打印出从1到最大的n位十进制数,比如输入数字3,则打印出1,2,3一直到最大的3位数999.
*/
#include<iostream>
using namespace std;
//并没有考虑大数的解法
void Print1ToMaxOfDigits_1(int n)
{
int number = 1;
int i = 0;
while (i++ < n)
{
number *= 10;
}
for (int i = 1; i < number; i++)
{
cout << i << " ";
}
}
//用字符串来模拟大数的解法
bool Increment(char* number)
{
bool isOverflow = false;
int nTakeOver = 0;
int nLength = strlen(number);
for (int i = nLength - 1; i >= 0; i--)
{
int nSum = number[i] - '0' + nTakeOver;
if (i == nLength - 1)
nSum++;
if (nSum >= 10)
{
if (i == 0)
isOverflow = true;
else
{
nSum -= 10;
nTakeOver = 1;
number[i] = '0' + nSum;
}
}
else
{
number[i] = '0' + nSum;
break;
}
}
return isOverflow;
}
void PrintNumber(char* number)
{
bool isBeginning0 = true;
int nLength = strlen(number);
for (int i = 0; i < nLength; ++i)
{
if (isBeginning0 && number[i] != '0')
{
isBeginning0 = false;
}
if (!isBeginning0)
{
cout << number[i];
}
}
cout << " ";
}
void Print1ToMaxOfDigits(int n)
{
if (n <= 0)
return;
char* number = new char[n + 1];
memset(number, '0', n);
number[n] = '\0';
while (!Increment(number))
{
PrintNumber(number);
}
delete[] number;
number = nullptr;
}
//数字全排列的解法
void Print1ToMaxOfNDigitsRecursively(char* number, int length, int index)
{
if (index == length - 1)
{
PrintNumber(number);
return;
}
for (int i = 0; i < 10; i++)
{
number[index + 1] = i + '0';
Print1ToMaxOfNDigitsRecursively(number, length, index+1);
}
}
void Print1ToMaxOfNDigits(int n)
{
if (n <= 0)
return;
char* number = new char[n + 1];
number[n] = '\0';
for (int i = 0; i < 10; i++)
{
number[0] = i + '0';
Print1ToMaxOfNDigitsRecursively(number, n, 0);
}
delete[] number;
number = nullptr;
}
int main()
{
int n;
cin >> n;
//Print1ToMaxOfDigits_1(n);
//Print1ToMaxOfDigits(n);
Print1ToMaxOfNDigits(n);
}
posted on 2021-12-27 08:37 xcxfury001 阅读(55) 评论(0) 收藏 举报
浙公网安备 33010602011771号