先贴代码
#include<stdio.h>
#include <stdlib.h>
#define N 10
int main(void){
int p[10];
char *sum;
int i,j,count=0;
for(i=0;i<N;i++){
scanf("%d",&p[i]);
count+=p[i];
}
sum=malloc(sizeof(char)*count);
for(i=0;i<count;i++){
for(j=0;j<N;j++){
if(j==0&&i==0) //0不能作为起始数字,所以直接continue
continue;
if(p[j]!=0){ //把数字转换成字符串,没处理完一位数,break。每次都从低位数开始,所以排列的数字会是最小的。
*sum++=j+'0';
p[j]--;
break;
}
}
}
*sum='\0'; //注意字符串结尾需要加上'\0'
printf("%s",sum-count); //sum要回溯
return 0;
}
这道题理解起来不难,思路也比较好想。
- 但是一开始定义的是int来处理sum,一直没法通过测试,后来发现是int太小了。
- 转用long,发现还是太小。
- 转成unsigned long,发现还是不够大…
- 于是发现一个问题,在处理数字类的问题时,需要思考判断可能数字是否会超出范围。当数字很大的时候,通用方法是把数字转化成字符串来表示和处理,这也是很多大数处理的基本思路。
- 转变成用字符来处理,顺利通过所有测试。