问题
描述给你个整数,用这n个数拼成个超长的整数,要令这个新的整数最小
例如:11 110 123拼出的最小数为:11011123例如:123 11 11拼出的最小数为:1111123
输入
第一行为n(1<=<=1000),接下来是个正整数,使用空格或者换行分开,每个数字的长度不会超过1000,不存在前导0;当n为0时结束程序。
输出
对于每组输入,输出拼成的新的整数的结果
输入样例
987 123 190
输出样例123190987
#include
#include
int fun1(int i)
{
int j;
for(j=0;i>0;j++,i/=10) ;
return j;
}
int fun(int a,int b)
{
int i,j,t=0;
i=fun1(a),j=fun1(b);
if((a*pow(10,j)+b)>(b*pow(10,i)+a)) return 1;
else return 0;
}
int main()
{
int n;
int i,j,t;
int a[1000];
scanf("%d",&n);
if(n==0) return 0;
for(i=0;i1000;)
{
scanf("%d",&j);
if(j>0&&j<=1000)
{
a[i]=j;
i++;
}
}
for(i=0;ifor(j=i+1;jif(fun(a[i],a[j])) t=a[j],a[j]=a[i],a[i]=t;
}
}
for(i=0;i1000;i++)
{
printf("%d",a[i]);
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char array[1001][1001];
char temp[1001];
char temp1[2001], temp2[2001];
bool compare(char* a1, char* a2)
{
char *p1 = a1, *p2 = a2, *p3 = temp1;
while(*p1 != '\0')
{
*p3 = *p1;
p1++; p3++;
}
while(*p2 != '\0')
{
*p3 = *p2;
p2++; p3++;
}
*p3 = '\0';
p1 = a1, p2 = a2, p3 = temp2;
while(*p2 != '\0')
{
*p3 = *p2;
p2++; p3++;
}
while(*p1 != '\0')
{
*p3 = *p1;
p1++; p3++;
}
*p3 = '\0';
if(strcmp(temp1, temp2) > 0)
return true;
return false;
}
void ShellSort(int length)
{
int d = length/2;
int i, j;
char *p1, *p2;
while(d>=1)
{
for(i=d;i<length;i++)
{
p1 = temp, p2 = array[i];
while(*p2 != '\0')
{
*p1 = *p2;
p1++; p2++;
}
*p1 = '\0';
j=i-d;
while(j>=0 && compare(array[j], temp) > 0)
{
p1 = array[j+d], p2 = array[j];
while(*p2 != '\0')
{
*p1 = *p2;
p1++; p2++;
}
*p1 = '\0';
j=j-d;
}
p1 = array[j+d], p2 = temp;
while(*p2 != '\0')
{
*p1 = *p2;
p1++; p2++;
}
*p1 = '\0';
}
d= d/2;
}
}
int main()
{
int size, i;
while(1)
{
cin >> size;
if(size == 0)
break;
for(i = 0; i < size; i++)
cin >> array[i];
ShellSort(size);
for(i = 0; i < size; i++)
cout << array[i];
cout << endl;
}
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: