题目:
输入数字n,按顺序打印出从1到最大的n位十进制数。
思路:
刚看到一眼最简单的想法就是直接先求出最大值,然后挨个循环打印,这样的话就很直接的掉入了这道题的陷阱,因为这里并没有限制n的范围,如果n大的离谱,用个长整型都会溢出。所以我们要考虑大数的情况。一般解决大数问题,最直观的方法就是字符串里每个字符都是'0'-'9'之间某个字符用来表示数字中的一位。这个思路虽然很直白,但由于模拟了整数的加法,代码有点长。我们可以再把问题转换为数字排列的解法,用递归将代码变得更简洁。
代码实现:
int i;
int Store(char* number){
int num=0;
bool startFlag=true;
int len=strlen(number);
for(int k=0;k<len;++k){
if(startFlag && number[k]!='0') startFlag=false;
if(!startFlag){
while(k<=len-1) num=num*10+number[k++]-'0';
}
}
return num;
}
bool Increment(char* number){
bool stopFlag=false;
int carry=0;
int len=strlen(number);
for(int k=len-1;k>=0;--k){
int sum=number[k]-'0'+carry;
if(k==len-1) ++sum;
if(sum>=10){
if(k==0) stopFlag=true;
else{
sum-=10;
carry=1;
number[k]=sum+'0';
}
}
else{
number[k]=sum+'0';
break;
}
}
return stopFlag;
}
int* printNumbers(int n, int* returnSize){
if(n<0){
*returnSize=0;
return NULL;
}
char* number=malloc((n+1)*sizeof(char));
memset(number,'0',(n+1)*sizeof(char));
number[n]='\0';
int count=0;
i=0;
while(n>i++) count=count*10+9;
int* res=malloc(count*sizeof(int));
i=0;
while(!Increment(number) && i<count) res[i++]=Store(number);
free(number);
*returnSize=count;
return res;
}