组数问题!
设有n个正整数(n<=20),将它们联成一排,组成一个最大的多位数。程序输入:n,程序输出:n个书连接成的多为位数。
以下是设计思路:
可以将问题这样变化一下:
比如我输入的是123,2,33,1006,12这几个数
我先找到最大的数字位数为四位,再将所有的数字变为四位数:
1230,2000,3300,1006,1200
然后进行排序
3300,2000,1230,1200,1006
这样将后面加上的0去掉的序列就是最大数字了
于是连成的最大的数字就是
332123121006
请哪位高手帮我写出这个程序!
----------------解决方案--------------------------------------------------------
我先找到最大的数字位数为四位,再将所有的数字变为四位数:
1230,2000,3300,1006,1200
然后进行排序
3300,2000,1230,1200,1006
这样将后面加上的0去掉的序列就是最大数字了
这步可以换一下吧``
实际就是比较每一个数的第一位数的大小`染后排序``输出``
再思考下`
----------------解决方案--------------------------------------------------------
我先找到最大的数字位数为四位,再将所有的数字变为四位数:
1230,2000,3300,1006,1200
然后进行排序
3300,2000,1230,1200,1006
这样将后面加上的0去掉的序列就是最大数字了
这步可以换一下吧``
实际就是比较每一个数的第一位数的大小`染后排序``输出``
再思考下`
那如果几个数第一位相等了怎么搞啊?
----------------解决方案--------------------------------------------------------
相等后``可以比第2位啊`
----------------解决方案--------------------------------------------------------
把它们看成一整数来比较。
----------------解决方案--------------------------------------------------------
我现在只遍了一点点
我明天下午来继续编``
明天上午要考试```
我现在要回去复习``
----------------解决方案--------------------------------------------------------
最后的1200是怎么变出来的 没看懂
----------------解决方案--------------------------------------------------------
问题已经解决```
程序代码:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int srsj ( int * ) ;
void tyws ( int *, int *b, int c ) ;
void shellsort ( int *, int *w, int n ) ;
int main ( )
{
int i, c ;
int s[20] ;
int b[20] ;
c = srsj (s) ; /*输入我们要输入的数据<=20个*/
tyws (s,b,c) ; /*将所以数转换为4位,不足的右边补上0*/
printf ("\n\n你输入的数为:\n"); /*将我们输入的数显示出来*/
for ( i=0; i<c; i++ )
printf ("%ld.", s[i]);
shellsort ( b,s,c ) ; /*进行排序操*/
printf ("\n") ;
printf ("输出结果为:\n") ; /*输出结果*/
for ( i=0; i<c; i++ )
printf ("%ld", s[i]);
getch();
return 0;
}
int srsj (int *s)
{
int i, c ;
printf ("请输入你想输入的数的个数:\n");
scanf (" %d", &c ) ;
system ("cls") ;
printf ("请输入你想输入的数:\n");
for ( i=0; i<c; i++ )
scanf (" %ld", &s[i]);
return c ;
}
void tyws(int *s, int*b, int c) /*根据数的位数补0*/
{
int i ;
for ( i=0; i<c; i++ )
{
if ( s[i] < 10 )
b[i] = s[i]*1000 ;
else if ( (s[i] >= 10) && (s[i] < 100) )
b[i] = s[i]*100 ;
else if ( (s[i] >= 100 ) && (s[i] < 1000 ) )
b[i] = s[i]*10 ;
else b[i] = s[i] ;
}
}
/*这是SHELL排序算法```我在里面加上了对原始输入数据的排序``这样就对原来我们输入和扩展后的数同时排序*/
/*LZ若是看不懂下面的算法``不要紧下来研究``现在只要知道`它是用来排序的就可以了*/
void shellsort(int *v, int *w, int n)
{
int gap,i,j,temp;
for (gap = n/2; gap > 0; gap /= 2)
for (i = gap; i < n; i++)
for (j=i-gap; j>=0 && v[j]<v[j+gap]; j-=gap)
{
temp = v[j];
v[j] = v[j+gap];
v[j+gap] = temp;
temp = w[j];
w[j] = w[j+gap];
w[j+gap] = temp;
}
}
----------------解决方案--------------------------------------------------------
调试环境DEV++4.9.9.2
第一步:
----------------解决方案--------------------------------------------------------
第一步:
第二步:
第三步:
OK``说实话`把我累安逸了````
我暂时找不到其他更简单的方法```不好意思啊``
----------------解决方案--------------------------------------------------------