CodeForces 550C Divisibility by Eight(枚举)
2015-06-27 11:52
393 查看
【题目链接】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
那么只要枚举后三位即可
代码:
【题目大意】
给一个不超过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,麻烦一些。
相关文章推荐
- Delphi 2009 泛型容器单元(Generics.Collections)[1]: TList<T>
- iOS_小问题积累(自定义tableviewcell时覆盖父类的变量出现的问题)
- iOS应用开发:什么是ARC?
- 解决默认安装AndroidX86 2.2以上版本不能上网
- easyui datagrid显示进度条控制操作
- 数据结构推荐的书籍
- picasso图片下载缓存库使用
- 《C/C++专项练习》 — (3)
- 泛型容器单元(Generics.Collections)[3]: TStack<T> 堆栈列表
- 《C/C++专项练习》 — (3)
- Android适配
- Docker入门
- 共用字段事件与结果不同关系与处理
- wexinjs 调用
- Checkpoint not complete造成oracle故障报告及解决方案
- 2015062702 - 裴行俭
- 初识PCA数据降维
- js操作下拉标签select
- Leetcode 6 ZigZag Conversion
- MariaDB 服务启动方法