打印从1到最大的n位数
- 注意大数问题,字符数组
- 递归地决定每一位取值0~9,第一位为1,小心栈溢出
- 用循环模拟加法,大数最高位在0处,注意0处>‘9’时表示溢出,稍微麻烦一些
- 注意打印时不要打印0
- 位数比较小时直接整数相加,不用大数法,位数比较大时可以用大数法,效率上差别不大
循环实现
void printBig(char* Arr)
{
if (Arr == nullptr) return;
bool isbegin = true;
int len=strlen(Arr);
for (int i = 0; i < len;i++)
{
if (isbegin && Arr[i] != '0')
isbegin = false;
if (!isbegin)
cout << Arr[i];
}
cout << ",";
}
void printBigNum(int n)
{
if (n <= 0) return;
char* Arr=new char[n+1];
Arr[n] = '\0';
for (int i = 0; i < n;i++)
Arr[i] = '0';
while (true)
{
int m = n - 1;
Arr[m]++;
while (m>0)
{
if (Arr[m] > '9')
{
Arr[m] = '0';
m--;
Arr[m]++;
}
else
break;
}
if (Arr[0] > '9')
break;
else
printBig(Arr);
}
delete[] Arr;
cout << endl;
}
递归实现
void subprintBigNumRecursively(char* Arr, int currpos, int limit)
{
if (Arr == nullptr || limit < 0) return;
for (int i = 0; i <= 9; i++)
{
Arr[currpos] = '0' + i;
if (currpos == limit)
printBig(Arr);
else
subprintBigNumRecursively(Arr, currpos+1, limit);
}
return;
}
void printBigNumRecursively(int n)
{
if (n <= 0) return;
char* Arr = new char[n + 1];
Arr[n] = '\0';
for (int i = 0; i < n; i++)
Arr[i] = '0';
subprintBigNumRecursively(Arr, 0, n-1);
cout << endl;
}