给出n位数,最多100
要求你随意去掉其中几个数 (可以完全不去掉)
然后如果剩下的数字组成的数能被8整除,输出YES和那个数,否则输出NO
分情况
不超过3位的直接暴力
超过三位的 根据
如果一个数的末三位数能被8整除,那么,这个数就一定能被8整除
还有种情况是最后剩下2位数。。。暴力两层for (这样最后只留下2位数)
注意判断前导零的情况。要就是最后留下三位或者两位 但不能有前导零
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define inf 1e9+1
char tm[105];
int sb[105];
int main()
{
int i,j,k;
scanf("%s",tm+1);
int n=strlen(tm+1);
int flag=0;
int flag2=0;
for (i=1;i<=n;i++)
{
sb[i]=tm[i]-'0';
if (sb[i]==8 )
flag=1;
if (sb[i]==0 )
flag2=1;
}
if (flag)
{
printf("YES\n8\n");
return 0;
}
if (flag2)
{
printf("YES\n0\n");
return 0;
}
if (n<3)
{
if (n==1)
{
if (sb[1]==8||sb[1]==0 )
printf("YES\n%d\n",sb[1]);
else
printf("NO\n");
}
else
{
if (sb[1]==8||sb[2]==8||(sb[1]*10+sb[2])%8==0||sb[2]==0)
{
if (sb[2]==0)
printf("YES\n0\n");
else if (sb[1]==8||sb[2]==8)
printf("YES\n8\n");
else
if ( (sb[1]*10+sb[2])%8==0)
printf("YES\n%d%d\n",sb[1],sb[2]);
}
else
printf("NO\n");
}
return 0;
}
for (i=1;i<=n;i++)
{
for (j=i+1;j<=n;j++)
{
for (k=j+1;k<=n;k++)
{
if ((sb[i]*100+sb[j]*10+sb[k]*1)%8==0&&sb[i]!=0)
{
printf("YES\n");
printf("%d%d%d\n",sb[i],sb[j],sb[k]);
return 0;
}
}
}
}
for (i=1;i<=n;i++)
{
for (j=i+1;j<=n;j++)
{
if ((sb[i]*10+sb[j]*1)%8==0&&sb[i]!=0)
{
printf("YES\n");
printf("%d%d\n",sb[i],sb[j]);
return 0;
}
}
}
printf("NO\n");
return 0;
}