CSDN轻松周赛赛题:能否被8整除

题目意思:

给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值