题目
pata1038
题目思路
本题思路是对输入的数字进行排序,首数字小的在前,若相同则依次比较之后数字,对于某一数字为其他数字前缀的,如32与321则比较将前缀去掉后的1与32的顺序。需要注意的是输出时对于全0的情况要额外输出。
参考代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef struct{
char c[9];
int n;
}num;
bool cmp(num n1,num n2);
int main()
{
int n,t=0;
cin>>n;
num nu[n];
for(int i=0;i<n;i++)
{
scanf("%s",nu[i].c);
nu[i].n=strlen(nu[i].c);
}
sort(nu,nu+n,cmp);
for(int i=0;i<n;i++)
{
if(t==0)
{
for(int j=0;j<nu[i].n;j++)
{
if(nu[i].c[j]!='0'||t==1)
{
printf("%c",nu[i].c[j]);
t=1;
}
}
}
else
{
printf("%s",nu[i].c);
}
}
if(t==0)
printf("0");
return 0;
}
bool cmp(num n1,num n2)
{
int i=0;
for(i=0;i<n1.n&&i<n2.n;i++)
{
if(n1.c[i]!=n2.c[i])
return n1.c[i]<n2.c[i];
}
if(n1.n==n2.n)
return true;
if(i==n1.n)
{
while(i<n2.n)
{
for(int j=0;j<n1.n&&i<n2.n;j++,i++)
{
if(n1.c[j]!=n2.c[i])
return n1.c[j]<n2.c[i];
}
}
}
else
{
while(i<n1.n)
{
for(int j=0;j<n2.n&&i<n1.n;j++,i++)
{
if(n2.c[j]!=n1.c[i])
return n2.c[j]>n1.c[i];
}
}
}
}