能否被8整除
给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。
输入格式: 多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。
输出格式 每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。
注意:重排可以让0开头。
参考:http://blog.csdn.net/computer_liuyun/article/details/40924233
快速判断一个数能否被1、2、3、4、5、6、7、8、9、10、11、12、13、17、19、23等整除的规律总结
:http://blog.csdn.net/u012605629/article/details/41014429
/* 能否被8整除 给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。 输入格式: 多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。 输出格式 每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。 注意:重排可以让0开头。 参考别人的 */ #include<iostream> #include<string.h> #include<stdio.h> using namespace std; int num[30],cnt[10]; char str[10005]; int main(){ int k,i,j,z,f1,f2,len; while(scanf("%s",str)!=EOF) { memset(cnt,0,sizeof(cnt)); memset(num,0,sizeof(num)); k=0; len=strlen(str); for(i=0;i<len;i++) { if(cnt[str[i]-'0']<3) num[k++]=str[i]-'0'; cnt[str[i]-'0']++; } if(k==1) { if(num[k-1]%8==0) printf("YES\n"); else printf("NO\n"); } else if(k==2) { if((num[k-1]*10+num[k-2])%8==0||(num[k-2]*10+num[k-1])%8==0) printf("YES\n"); else printf("NO\n"); } else { f1=0,f2=0; for(i=0;i<k;i++) { if(f1) break; for(j=0;j<k;j++) { if(f2) break; if(j!=i) { for(z=0;z<k;z++) if(z!=i&&z!=j) if((num[i]*100+num[j]*10+num[z])%8==0) { printf("YES\n"); f1=1; f2=1; break; } } } } if(f1==0) printf("NO\n"); } } return 0; }