题目意思:
给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。输入格式:多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。输出格式每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头。
http://student.csdn.net/mcs/programming_challenges
题目分析:
判断一个数是否能够被8整除,只需要判断这个数的后三位是否能够整除8即可,对于此题需要模拟判断所有的后三位数重排的六个数是够被8整除,只是注意一位数和两位数的时候需要自己判断。
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int ff(char a,char b,char c){//判断三个数字组成的数能否被8整除
int s[7];
s[1]=(a-'0')*100+(b-'0')*10+(c-'0');
s[2]=(a-'0')*100+(c-'0')*10+(b-'0');
s[3]=(b-'0')*100+(c-'0')*10+(a-'0');
s[4]=(b-'0')*100+(a-'0')*10+(c-'0');
s[5]=(c-'0')*100+(a-'0')*10+(b-'0');
s[6]=(c-'0')*100+(b-'0')*10+(a-'0');
for(int i=1;i<=6;i++){
//cout<<s[i]<<endl;
if(s[i]%8==0) return 1;
}
return 0;
}
char s[10005];
int main()
{
while(scanf("%s",s)!=EOF){
int len=strlen(s);
int ok=0;
if(len==1){
if((s[0]-'0')%8==0) ok=1;
}
else if(len==2){
if(((s[0]-'0')*10+(s[1]-'0'))%8==0) ok=1;
if(((s[1]-'0')*10+(s[0]-'0'))%8==0) ok=1;
}
else {
for(int i=0;i<len;i++){
if(ff(s[i],s[(i+1)%len],s[(i+2)%len])){
ok=1; break;
}
}
}
if(ok) printf("YES\n");
else printf("NO\n");
}
return 0;
}