一 问题描述 设有n个正整数(n<=20),将它们联成一排,组成一个最大的多位数。程序输入:n,程序输出:n个数连接成的多位数。二 问题分析 可以将问题这样变化一下: 比如我输入的是 123 2 33 1006 12这样几个数字 我先找出最大的数字的位数为四位,再将所有的数字变成四位数: 1230 2000 3300 1006 1200 然后进行排序 3300 2000 1230 1200 1006 这样将后面加上的0去掉的序列不就是最大数字吗? 于是最大数字就是 332123121006 因为以下程序用的INT的类型所以只在-32728~32727间有效,假如想要更大范围须改成long类型
三 C程序
#define MAXSIZE 100 #include<stdio.h> int max(int a[],int i) /*判定出最大数字的位数*/ {int m; int size(); m=a[i]; for(;i>=0;i--) if(a[i]>m) m=a[i]; return(size(m)); }
int size(int interger) /*判定出这个要组合数字的位数*/ { if(interger>10000) return 5; else if(interger>1000) return 4; else if(interger>100) return 3; else if(interger>10) return 2; else return 1; }
int change(int i ,int maxsize) /*将本数字变成和最大数相同位数的数字*/ { int size(); switch(maxsize-size(i)) {case 0:break; case 1:i=i*10;break; case 2:i=i*100;break; case 3:i=i*1000;break; case 4:i=i*10000;break; default:printf("error\n"); } return i; }
main() { int a[MAXSIZE],b[MAXSIZE],i,j,count,temp,s; printf("Please input some intergers and input -1 to finish\n\n"); for(i=0;i<MAXSIZE;i++) { scanf("%d",&a[i]); if(a[i]<0) break; } count=i-1; s=max(a,count); for(i=count;i>=0;i--) b[i]=change(a[i],s); for(j=0;j<=count-1;j++) /*用冒泡法对变化数排序,其实本质是在对原组合数字进行排序*/ for(i=0;i<=count-1;i++) { if(b[i]<b[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; temp=b[i]; b[i]=b[i+1]; b[i+1]=temp; } } printf("max interger ="); for(i=0;i<=count;i++) printf("%d",a[i]); }
四 实验结果
输入:56 2 1 输出:5621
输入:21 35 2 输出:35221
|