首页 > 代码库 > CSDN 轻松周赛赛题:能否被8整除

CSDN 轻松周赛赛题:能否被8整除

轻松周赛赛题:能否被8整除

 

题目详情

给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。

输入格式:

多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。

输出格式

每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头。

 

 

答题说明

输入样例  

610

122

输出样例  

YES

NO

解释  

第一个数可以变为016 , 160

 

解题:很水的一道题。。。思路很简单,1000是能被8整除的,所以一千的倍数都能被8整除,假设输入的大数为x,把x分解成x = a*1000+b

 

很明显a*1000能够被8整除,所以只要判断b能不能被8整除即可。

 

三位数能够被8整除的直接枚举就可以了。

 

 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib>10 #include <string>11 #include <set>12 #include <stack>13 #define LL long long14 #define pii pair<int,int>15 #define INF 0x3f3f3f3f16 using namespace std;17 const int maxn = 10010;18 char str[maxn];19 int cnt[10],table[200][10],len,tot;20 bool vis[maxn];21 bool dfs(int sum,int d,int cur){22     if(cur >= d) return sum%8 == 0;23     for(int i = 0; i < len; ++i){24         int tmp = str[i] - 0;25         if(!vis[i]){26             vis[i] = true;27             if(dfs(sum*10 + tmp,d,cur+1)) return true;28             vis[i] = false;29         }30     }31     return false;32 }33 void create(){34     memset(table,0,sizeof(table));35     for(int i = tot = 0; i<<3 < 1000; ++i){36         int db = 0,tmp = i<<3;37         while(tmp){38             int u = tmp%10;39             table[tot][u]++;40             tmp /= 10;41             db++;42         }43         table[tot++][0] += 3 - db;44     }45 }46 bool check(){47     int i,j;48     memset(cnt,0,sizeof(cnt));49     for(i = 0; i < len; ++i) cnt[str[i]-0]++;50     for(i = 0; i < tot; ++i){51         for(j = 0; j < 10; ++j)52             if(cnt[j] < table[i][j]) break;53         if(j == 10) return true;54     }55     return false;56 }57 int main() {58     create();59     while(~scanf("%s",str)){60         len = strlen(str);61         if(len <= 3){62             memset(vis,false,sizeof(vis));63             if(dfs(0,len,0)) puts("YES");64             else puts("NO");65         }else if(check()) puts("YES");66         else puts("NO");67     }68     return 0;69 }
View Code

 

CSDN 轻松周赛赛题:能否被8整除