二进制的妙用

在n个不同的整数中,任意取若干个,要求它们的和是7的倍数,问有几种取法。输入数据第一行是整数t,表示有t组数据。接下来有t行,每行是一组数据,第一个数是n(1<=n<=16),表示要从n个整数中取数,接下来就是n个整数。对每组数据,输出一行,表示取法的数目(一个都不取也算一种取法)。
输入样例
3
3 1 2 4
5 1 2 3 4 5
12 1 2 3 4 5 6 7 8 9 10 11 12
输出样例
2
5
586

解题思路:总体思路为枚举法。对n个整数,有pow(2,n)种取法。每种取法都算一下是不是7的倍数。可以把每个整数的状态(取或者不取)用一个二进制位表示,1为取,0为不取。可以发现,n位二进制数和n个整数的2^n种取法正好是一一对应的。例如,对于4个整数,二进制数1111(十进制15)代表全取,0000代表全不取。那么让一个变量i从0循环至15,就可以遍历所有的取法。对于i的每个取值,用位运算找出哪些位为1,让其对应的整数位求和即可。
代码:

# include <cmath>
#include<iostream>
using namespace std;
int main()
{
	int t;
	int number[50];
	int Bit(int binary, int rank);
	cin >> t;
	while (t--)
	{
		int ways = 0;		//取法
		int n;
		cin >> n;
		for (int i = 0; i < n; ++i)
		{
			cin >> number[i];
		}
		int tmp = pow(2.0, n);
		for (int x = 0; x < tmp; ++x) {
			int sum = 0;		//总和
			for (int i = 0; i < n; ++i) {
				if (Bit(x, i))	sum = sum + number[i];
			}
			if (sum % 7 == 0)	ways++;
		}
		cout << ways<<endl;
	}
	return 0;
}
int Bit(int binary, int rank)		//对于二进制数binary,返回其第rank位
{
	return ((1 << rank)&binary);
}

猜你喜欢

转载自blog.csdn.net/qq_42944230/article/details/87002963
今日推荐