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

 

你可能感兴趣的:(csdn)