题目
输入数字n,按顺序打印出从1到最大的n位十进制数。比如,输入3,则打印出1、2、3一直到最大的3位数,即 999。
分析
跳进面试官陷阱,没有考虑大数问题
题目看起来很简单。看到这个问题之后,最哦容易想到的办法是先求出最大的n位数,然后用一个循环从1开始逐个打印。于是很容易写下如下的代码:
void print1ToMaxOfNDigits_1( int n )
{
int number = 1;
int i = 0;
while( i++ < n )
number *= 10;
for( i=1;i<number; ++i )
cout << i << "\t";
}
初看之下好像没有问题,但是仔细分析这个问题就会发现面试官没有规定n的范围。当输入的n很大的时候,求最大的n位数用整型(int)或者长整型(long long)都会溢出?也就是说需要考虑大数问题。
在字符串上模拟数字加法的解法
经过分析,会想到解决这个问题需要表达一个大数。最常用也是最容易的方法是用字符串或者数组表达大数。接下来用字符串的方法解决大数顾问团。
用字符串表示数字的时候,最直观的方法就是字符串里每个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位。因为数字最大是n位的,因此需要一个长度位n+1的字符串(字符串中最后一个是结束符号‘\0’)。当实际数字不够n位的时候,在字符串的