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 long
14 #define pii pair<int,int>
15 #define INF 0x3f3f3f3f
16 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
原文地址:https://www.cnblogs.com/crackpotisback/p/4093573.html