能被15整除就一定能被3和6整除,能被5整除末尾一定是0或者5,那么对于最后一位有0不选5(保证最大)。然后能被3整除,各个位上的和能被3整除,如果不满足,记和是sum.若sum%3==1,,则删一个1或者 4或者7有1不删4,有4不删7.若没有这些就删两个2,5,8的组合。当sum%3==2时,方法一样。要特别注意顺序,保证最大。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<set>
#include<iostream>
using namespace std;
int num[10];
char str[1010];
int solve(int sum)
{
if(sum%3==1)
{
if(num[1]>0)
{
num[1]--;
}
else if(num[4]>0)
{
num[4]--;
}
else if(num[7]>0)
{
num[7]--;
}
else if(num[2]>=2)
{
num[2]-=2;
}
else if(num[2]>0&&num[5]>0)
{
num[2]--;
num[5]--;
}
else if(num[2]>0&&num[8]>0)
{
num[2]--;
num[8]--;
}
else if(num[5]>=2)
{
num[5]-=2;
}
else if(num[5]>0&&num[8]>0)
{
num[5]--;
num[8]--;
}
else if(num[8]>=2)
{
num[8]-=2;
}
else return -1;
}
else if(sum%3==2)
{
if(num[2]>0)
{
num[2]--;
}
else if(num[5]>0)
{
num[5]--;
}
else if(num[8]>0)
{
num[8]--;
}
else if(num[1]>=2)
{
num[1]-=2;
}
else if(num[1]>0&&num[4]>0)
{
num[1]--;
num[4]--;
}
else if(num[1]>0&&num[7]>0)
{
num[1]--;
num[7]--;
}
else if(num[4]>=2)
{
num[4]-=2;
}
else if(num[4]>0&&num[7]>0)
{
num[4]--;
num[7]--;
}
else if(num[7]>=2)
{
num[7]-=2;
}
else return -1;
}
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
int cas,sum;
scanf("%d",&cas);
getchar();
while(cas--)
{
//fgets(str,1010,stdin);
scanf("%s",str);
memset(num,0,sizeof(num));
sum=0;
for(int i=0; str[i]!='\0'; i++)
{
int a=str[i]-'0';
num[a]++;
sum+=a;
}
if(num[0]==0&&num[5]==0)
{
cout<<"impossible\n";
continue;
}
if(num[0]==0&&num[5]>0)
{
num[5]--;
if(sum%3==0)
{
for(int i=9; i>=0; i--)
{
for(int j=0; j<num[i]; j++)
cout<<i;
}
cout<<5<<endl;
}
else
{
int a=solve(sum);
if(a==-1)
cout<<"impossible\n";
else
{
for(int i=9; i>=0; i--)
{
for(int j=0; j<num[i]; j++)
cout<<i;
}
cout<<5<<endl;
}
}
}
else if((num[0]>0&&num[5]==0)||(num[0]>0&&num[5]>0))
{
num[0]--;
if(sum==0)
{
cout<<0<<endl;
}
else if(sum%3==0)
{
for(int i=9; i>=0; i--)
{
for(int j=0; j<num[i]; j++)
cout<<i;
}
cout<<0<<endl;
}
else
{
int a=solve(sum);
if(a==-1)
cout<<"0\n";
else
{
int flag=0;
for(int i=1; i<=9; i++)
if(num[i]) flag=1;
if(flag)
{
for(int i=9; i>=0; i--)
{
for(int j=0; j<num[i]; j++)
cout<<i;
}
}
cout<<0<<endl;
}
}
}
}
return 0;
}