解题思路
考虑8的倍数的特征,只要最后三位组成的数时8的倍数就好了。。预处理出1000以内8的倍数,判断输入的字符串里是否包含它们,如果有包含,就把它放最后输出。
注意特判小于三位的情况还有刚好那三位为0的情况。
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
string s;
int l,cnt,k,a[1010],w[15],v[15];
bool flag;
string read() {
char a=getchar();
string ss="";
while(a<'0'||a>'9')
a=getchar();
while(a>='0'&&a<='9') {
ss=ss+a;
a=getchar();
}
return ss;
}
void output(int a1,int a2,int a3) {
printf("YES\n");
int o1,o2,o3;
string ss;
o1=o2=o3=1;
for(int i=0; i<l; i++) {
int x=s[i]-'0';
if(o1==1&&x==a1) {
o1=2;
continue;
}
if(o2==1&&x==a2) {
o2=2;
continue;
}
if(o3==1&&x==a3) {
o3=2;
continue;
}
ss=ss+s[i];
}
cout<<ss<<a1<<a2<<a3<<endl;
}
int main() {
for(int i=100; i<=1000; i++) {
if(i%8==0)
a[++cnt]=i;
}
s=read();
l=s.size();
if(l<3) {
int x=0;
for(int i=0; i<l; i++)
x=x*10+s[i]-'0';
if(x%8==0) {
printf("YES\n");
cout<<x;
} else printf("NO\n");
}
for(int i=0; i<l; i++) {
int x=s[i]-'0';
if(s[i]=='0')k++;
w[x]++;
}
if(k>=3)
{
output(0,0,0);
return 0;
}
for(int i=1; i<=cnt; i++) {
int a1=a[i]/100,a2=a[i]/10%10,a3=a[i]%10;
v[a1]++,v[a2]++,v[a3]++;
if(w[a1]>=v[a1]&&w[a2]>=v[a2]&&w[a3]>=v[a3]) {
output(a1,a2,a3);
return 0;
}
v[a1]=v[a2]=v[a3]=0;
}
printf("NO");
}
/*
7200002400000000000*/