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

18 篇文章 1 订阅

题目详情:

给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。

输入格式:

多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。

输出格式

每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头。



答题说明:

输入样例  

610

122

输出样例  

YES

NO

解释  

第一个数可以变为016 , 160


判断一个数n是否能被8整除

当n的位数是1位、2位或者3位时直接与8整除看余数是否为0,

当n为三位数以上时,看该数的末尾(最后)三位数是否能被8整除,如果能则该数就能被8整除


这道题的位数是不超过10000位,那可以用一个String来存放输入的数,再把它放入一个数组中去,那我们就看0~9中的数字 出现了几次,由于判断的是3位数,所以这些数字出现的次数大于3时只需记录3次即可,但如果里面的数字0或者8出现了3次或3次以上,则不用进行下面的判断,直接输出YES

最好遍历判断即可


#include <iostream>
#include <string>
using namespace std;


int main()
{
    string str;
    while(cin >> str)
    {
        int a[10][2], b[30];
        for(unsigned int i = 0; i < 10; i ++)
        {
            a[i][0] = i;
            a[i][1] = 0;
            b[i] = 0;
            b[i + 10] = 0;
            b[i + 20] = 0;
        }


        for(unsigned int i = 0; i < str.length(); i ++)
        {
            if((a[str.at(i) - '0'][1]) > 2)
                continue;
            a[str.at(i)-'0'][1] ++ ;
        }


        if(a[8][1] == 3 || a[0][1] == 3)
        {
            cout << "YES" << endl;
            continue;
        }
        int t = 0;
        for(unsigned int i = 0; i < 10; i ++ )
        {
            for(int j = 0; j < a[i][1]; j ++ )
            {
                b[t] = i;
                t ++;
            }
        }


        bool endl1 = true;


        if(t == 1)
        {
            if(b[0] == 8)
                cout << "YES" << endl;
            else
                cout << "NO" << endl;
            continue;
        }
        else if(t == 2)
        {
             for(int i = 0; i < t && endl1; i ++)
             {
                for(int j = 0; j < t && endl1; j ++)
                {
                    if((((b[i] * 10 + b[j]) % 8) == 0) && (i != j))
                    {
                        cout << "YES" << endl;
                        endl1 = false;
                    }
                }
             }
        }
        else
        {
            for(int i = 0; i < t && endl1; i ++)
            {
                for(int j = 0; j < t && endl1; j ++)
                {
                    for(int k = 0; k < t && endl1; k ++)
                    {
                        if((((b[i] * 100 + b[j] * 10 + b[k]) % 8) == 0) && (i != j) && (i != k) && (j != k))
                        {
                            cout << "YES" << endl;
                            endl1 = false;
                        }
                    }
                }
            }
        }
        if(endl1)
            cout << "NO" << endl;
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚码农404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值