题目意思:
给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。输入格式:多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。输出格式每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头。
题目分析:
判断一个数是否能够被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; }
时间: 2024-10-14 06:31:14