7、设有n个正整数,n<=20,每个正整数均在int范围内,将它们连成一排组成一个最小的多位整数,并将结果保存至文件。
因为最多需要连接20个正整数,int最多是10位数,20个10位数就是200位,用整数数据类型无法存储这么多数位,所以用的字符串存储的,我使用的IDE是Dev-Cpp, 使用它运行程序,会在生成exe的那个目录下生成result.txt,如果使用的是其他IDE可能有所不同,下面是一个实现,供参考:
#include <stdio.h>
//将数字每个数位提取后存入字符串中
int numToStr(int num,char * str){
int i=0;
int sum=0;
int numtemp=num;
int t;
int weight=1;
int k=0;
int numtemp2 = num;
//计算正整数有多少位
while(sum!=numtemp){
t=numtemp2%10;
sum+=t*weight;
numtemp2/=10;
weight*=10;
k++;
}
sum=0;
i=0;
weight=1;
//把每个数位依次存入字符串中
while(sum!=numtemp){
t=num%10;
sum+=t*weight;
str[k-1-i]=t+'0';
num/=10;
weight*=10;
i++;
}
return i; //返回正整数有几位,便于main函数里拼接下一个数
}
int main(void){
int nums[20]; //最多20个正整数
//使用字符数组来存储连接的这个正整数
//假如输入了20个正整数,int最大21亿多,就是最长10位数,20乘以10等于200,加上结尾的空字符最长是201个字符
char numStr[201];
int i=0;
int n;
printf("请输入要连接多少个正整数:");
scanf("%d",&n);
while(i<n){
printf("请输入第%d个正整数:",i+1);
scanf("%d",&nums[i]);
i++;
}
//对输入的正整数从小到大排序,然后依次把他们连接到字符数,
//从小到大连接能形成一个最小的多位数
int j;
int temp;
for(i=0;i<n-1;i++){
for(j=i;j<n;j++){
if(nums[i]>nums[j]){
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
int len=0;
int allLen =0;
//将排序后数组数字依次存入字符串中
for(i=0;i<n;i++){
allLen+=len;
len=numToStr(nums[i],numStr+allLen);
}
allLen+=len;
numStr[allLen]='\0';
printf("%s",numStr);
FILE * fp = fopen("result.txt","w+");
//写入文件
if(fp==NULL){
printf("文件打开或创建失败!\n");
return -1;
}
fprintf(fp,"%s",numStr);
return 0;
}