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,麻烦一些。

你可能感兴趣的:(codeforces)