0
点赞
收藏
分享

微信扫一扫

CodeForces 550C Divisibility by Eight(枚举)


题目链接】​​click here~~​​

题目大意

给一个不超过100位的数字,要求能否删掉几位数,剩下的数能被8整除

解题思路】:这里有个性质:如果一个数后三位能被8整除,那么这个数就能被8整除

证明:举一个5位数的例子吧,
例如
_____  _____  __              __  __                __  ___
abcde=ab000+cde=1000×ab+cde=8×125×ab+cde
很明显,8×125×ab一定是8或者125的倍数,因此当cde能被8或者125整除时,五位数abcde就能被8或者125整除。位数再多也是一样的,主要是1000=125*8

那么只要枚举后三位即可

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
char str[110];
while(cin>>str)
{
bool ok=false;
int len=strlen(str);
for(int i=0; i<len; ++i)
{
if((str[i]-'0')%8==0)
{
puts("YES");
cout<<(str[i]-'0')<<endl;
return 0;
}
}
for(int i=0; i<len; ++i)
{
for(int j=i+1; j<len; ++j)
{
if(((str[i]-'0')*10+(str[j]-'0'))%8==0)
{
puts("YES");
cout<<((str[i]-'0')*10+(str[j]-'0'))<<endl;
return 0;
}
}
}
for(int i=0; i<len; ++i)
{
for(int j=i+1; j<len; ++j)
{
for(int k=j+1; k<len; ++k)
{
if(((str[i]-'0')*100+(str[j]-'0')*10+str[k]-'0')%8==0)
{
puts("YES");
cout<<((str[i]-'0')*100+(str[j]-'0')*10+str[k]-'0')<<endl;
return 0;
}
}
}
}
puts("NO");
}
}

官方题解是用dp,麻烦一些。


举报

相关推荐

0 条评论