链接:https://ac.nowcoder.com/acm/contest/308/C
来源:牛客网
题目描述
tokitsukaze又在玩3ds上的小游戏了,现在她遇到了难关。
tokitsukaze得到了一个整数x,并被要求使用x的每一位上的数字重新排列,组成一个能被8整除的数,并且这个数尽可能大。
聪明的你们请帮帮可爱的tokitsukaze,如果无法组成被8整除的数,请输出-1。
保证输入不含前导0,输出也不能含前导0。
输入描述:
第一行包括一个正整数T(T<=1000),表示T组数据。 接下来T行,每一行包括一个整数x,(0≤x≤10^100)。
输出描述:
请输出用这些数字组成出能被8整除的最大的数,如果无法组成出能被8整除的数,请输出-1。
示例1
输入
复制
2 666 1256
输出
复制
-1 6512
这道题,对八整除,首先,我们发现,1000%8==0,所以我们只需要确定后三位是否对八整除就行了,分类讨论,输入为一位的时候,输入两位数的时候,输入三位或者三位以上数字的时候
#include<bits/stdc++.h>
using namespace std;
#define ll long long
/**错误代码,过了百分之九十多,剩下的没过,百思不得姐
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int f12(int t1)
{
int w[4];
w[1]=t1/100;
w[2]=t1/10%10;
w[3]=t1%10;
int f[10];
f[1]=w[1]*100+w[2]*10+w[3];
f[2]=w[1]*100+w[3]*10+w[2];
f[3]=w[2]*100+w[1]*10+w[3];
f[4]=w[2]*100+w[3]*10+w[1];
f[5]=w[3]*100+w[1]*10+w[2];
f[6]=w[3]*100+w[2]*10+w[1];
sort(f+1,f+7);
for(int i=6;i>=1;i--)
{
if(f[i]%8==0){
t1=f[i];
return t1;
}
}
return -7;
}
int main()
{
int t;
int a[12];
scanf("%d",&t);
char b[104];
while(t--)
{
char s;
scanf("%s",b);
memset(a,0,sizeof(a));
int lb=strlen(b);
for(int i=0;i<lb;i++)
{
a[b[i]-'0']++;
}
int flag=0;
int t1=0;
if(lb>=3)
{
for(int i=0;i<=9;i++)
{
if(a[i]==0) continue;
a[i]--;
for(int j=i;j<=9;j++)
{
if(a[j]==0) continue;
a[j]--;
for(int k=j;k<=9;k++)
{
if(a[k]==0) continue;
t1=i;
t1=t1*10+j;
t1=t1*10+k;
t1=f12(t1);
if(t1%8==0)
{
flag=1;
a[k]--; break;
}
}
if(flag) break;
a[j]++;
}
// printf("%d\n",t1);
if(flag) {//t1=f12(t1);
break;
}
a[i]++;
}
if(flag==0)
{
printf("-1\n");
}
else {
for(int i=9;i>=0;i--)
{
while(a[i])
{
printf("%d",i);
a[i]--;
}
}
printf("%03d\n",t1);
}
}
else
{
for(int i=0;i<lb;i++)
{
t1=t1*10+b[i]-'0';
}
int t2=t1%10*10+t1/10;
if(t1<10)
{
if(t1%8==0){
printf("%d\n",t1);
}
else {
printf("-1\n");
}
}else if(t1%8==0) {
printf("%d\n",t1);
}else if(t2%8==0)
{
printf("%d\n",t2);
}else {
printf("-1\n");
}
}
}
return 0;
}
**/
int main()
{
int t;
int a[12];
scanf("%d",&t);
string b;
while(t--)
{
char s;
cin>>b;
//scanf("%s",b);
memset(a,0,sizeof(a));
int lb=b.size();
for(int i=0;i<lb;i++)
{
a[b[i]-'0']++;
}
int flag=0;
string str="";
int t1=0;
if(lb>=3)///输入三位或者三位以上数字的时候
{
for(int i=0;i<=999;i+=8)
{
int a1,b,c;
a1=i/100;
b=i/10%10;
c=i%10;
a[a1]--;
a[b]--;
a[c]--;
if(a[a1]>=0&&a[b]>=0&&a[c]>=0)
{
string tr="";
for(int j=9;j>=0;j--)
{
for(int k=1;k<=a[j];k++)
{
tr=tr+(char)(j+'0');
}
} flag=1;
tr+=(char)(a1+'0');
tr+=(char)(b+'0');
tr+=c+'0';
if(str<tr) str=tr;
}
a[a1]++;
a[b]++;
a[c]++;
}
if(flag==0)
{
printf("-1\n");
}
else {
cout<<str<<endl;
}
}
else///小于三位的时候
{
for(int i=0;i<lb;i++)
{
t1=t1*10+b[i]-'0';
}
int t2=t1%10*10+t1/10;
if(t1<10)///输入个位数的时候
{
if(t1%8==0){
printf("%d\n",t1);
}
else {
printf("-1\n");
}
}else if(t1%8==0) {//两位数
printf("%d\n",t1);
}else if(t2%8==0)两位数
{
printf("%d\n",t2);
}else {
printf("-1\n");
}
}
}
return 0;
}