【题目链接】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,麻烦一些。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-09 09:39:05