ACM判断整除

判断整除
【题目描述】

一个给定的正整数序列,在每个数之前都插入+号或-号后计算它们的和。比如序列:1、2、4共有8种可能的序列:

(+1) + (+2) + (+4) = 7

(+1) + (+2) + (-4) = -1

(+1) + (-2) + (+4) = 3

(+1) + (-2) + (-4) = -5

(-1) + (+2) + (+4) = 5

(-1) + (+2) + (-4) = -3

(-1) + (-2) + (+4) = 1

(-1) + (-2) + (-4) = -7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
所有结果中至少有一个可被整数k整除,我们则称此正整数序列可被k整除。例如上述序列可以被3、5、7整除,而不能被2、4、6、8……整除。注意:0、-3、-6、-9……都可以认为是3的倍数。

【输入】

输入的第一行包含两个数:N(2<N<10000)和k(2<k<100),其中N代表一共有N个数,k代表被除数。第二行给出序列中的N个整数,这些整数的取值范围都0到10000之间(可能重复)。

【输出】

如果此正整数序列可被k整除,则输出YES,否则输出NO。(注意:都是大写字母)

【输入样例】

3 2

1 2 4

【输出样例】
(-1)+(-2)+(-4)=-7
(-1)+(-2)+(+4)=1
(-1)+(+2)+(-4)=-3
(-1)+(+2)+(+4)=5
(+1)+(-2)+(-4)=-5
(+1)+(-2)+(+4)=3
(+1)+(+2)+(-4)=-1
(+1)+(+2)+(+4)=7
NO
————————————————
本题用二进制数01表示第N种情况各个数的正负号0代表负,1代表正,比如例题种,第一种情况全是整数的情况下那么就是111,以此来解题,函数convert是将第N种情况转化成二进制形式

#include<iostream>
#include<stack>
#include<cmath>
#include<string>
using namespace std;
#include<queue>
#include<algorithm>
int n;
string convert(int i)//将第i种情况转化成二进制形式
{
    int k = n;
    string s = "";
    if (i == 0)
    {
        for (int j = 0; j < n; j++)
            s = s + "0";
        return s;
    }
    while (k--)
    {
        char ch = i % 2 + 48;
        s = s + ch;
        i = i / 2;
    }
    reverse(s.begin(), s.end());
    return s;
}
int main()
{
    int k, j, i, count = 0, flag = 0;
    cin >> n >> k;
    int a[10000];
    for (i = 0; i < n; i++)
        cin >> a[i];
    count = pow(2, n);//n个数就有2的n次方种情况
    for (i = 0; i < count; i++)
    {
        string s = convert(i);
        int sum = 0;
        for (j = 0; j < n; j++)
        {
            if (s[j] == '0')
            {
                sum = sum - a[j];
                if (j == n - 1)   //最后一项出结果,需要打上'='号
                    cout << "(-" << a[j] << ")=";
                else
                    cout << "(-" << a[j] << ")+";
            }
            else if (s[j] == '1')
            {
                sum = sum + a[j];
                if (j == n - 1)   //最后一项出结果,需要打上'='号
                    cout << "(+" << a[j] << ")=";
                else
                    cout << "(+" << a[j] << ")+";
            }
        }
        cout << sum << endl;   //每一项的结果
        if (sum%k == 0)
        {
            flag = 1;
        }
    }
    if (flag)
        cout << "YES" << endl;
    else
        cout << "NO";
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值