打印从1到最大的n位数
文章目录
题目
输入数字n,按顺序打印从1到最大的n位十进制数,如输入3,打印从1、2、3到999.
分析
- 是一个大数问题
- 用字符串或数组表达大数。
- 使用长度为n+1的字符串(结尾为’\0’)
- 在字符串表达的数字上模拟加法
- 把字符串打印出来
小细节:
- 如何快速判断每次加1后是否到达最大值
- 输出时,不输出前面的0
实现
#include <iostream>
using namespace std;
#include <string.h>
bool increment(char* strnum, int len)
{
bool overload = false;
int trans = 0;
for (int i=len-1; i>=0; --i)
{
int val = strnum[i] - '0' + trans;
if (i==len-1)
{
++val;
}
if (val>=10)
{
if (i==0)
{
overload = true;
}
else
{
val -= 10;
strnum[i] = char(val + '0');
trans = 1;
}
}
else
{
strnum[i] = char(val + '0');
trans = 0;
}
}
return !overload;
}
void printstr(char* strnum, int len)
{
//cout << strnum << endl;
bool validNumStart = false;
for (int i=0; i<len; ++i)
{
if (!validNumStart && strnum[i]!='0')
validNumStart = true;
if (validNumStart)
cout << char(strnum[i]);
}
cout << endl;
}
void print1toMaxNDigits(int n)
{
int len = n;
char * strnum = new char[n + 1];
memset(strnum, '0', n+1);
strnum[n] = '\0';
while (increment(strnum, len))
{
printstr(strnum, len);
}
return;
}
void main()
{
print1toMaxNDigits(4);
system("pause");
}
递归形式:
void print1toMaxNDigits2Core(char* strnum, int index, int len)
{
if (index==len-1)
{
printstr(strnum, len);
return;
}
for (int i=0; i<10; ++i)
{
strnum[index+1] = i + '0';
print1toMaxNDigits2Core(strnum, index + 1, len);
}
}
void print1toMaxNDigits2(int n)
{
if (n <= 0) return;
int len = 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';
print1toMaxNDigits2Core(strnum, 0, n);
}
}