计算C ++中前一半和后一半相同位的偶数长度二进制序列
我们给了几个比特n作为二进制序列的输入。此处的目标是找到长度为2n的二进制序列,以使其前半部分和后半部分的总和相等。前n位和后n位具有相同的和。
我们有一个二进制序列,因此将数字放在任何位置的唯一选择是0和1。对于前半部分和后半部分的n位,否。可能的组合是-
n位全零(01)nC0=1
n位和11的nC1
n位与21的nC2
。
。
具有n1的nCn的n位
对于2n位
上半部分为01,下半部分为01nC0XnC0
上半部分为11,下半部分为11nC1XnC1
前一半为21,后一半为21nC2XnC2
..............
前一半为n1,后一半为n1nCnXnCn
这样的组合总数=nC0*nC0+nC1*nC1+.......+nCn*nCn
=(nC0)2+(nC1)2+..........+(nCn)2
输入值
n=1
输出结果
Sequences with same sum of first and second half bits: 2
说明-可能的2*1=2位序列00,01,10,11这四个01和10中的总和为=1
输入值
n=2
输出结果
Sequences with same sum of first and second half bits: 6
说明-可能的2*2=4位序列0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111
在这些序列中,前2位和后2位的总和相同-
0000,0101,0110,1001,1010,1111,总计=6
以下程序中使用的方法如下
整数“位”存储数字。
函数findSeq(intn)将n作为输入,并返回具有等于或大于前一半和后一半2n位的序列数。
变量nCi用于存储初始值=1,因为nC0为1。
初始化ans=0,它将把这样的序列计为nCi*nCi之和。
从i=0到n开始将nCi*nCi添加到ans,按上述公式计算每个nCi。
在for循环结束后,返回以“ans”表示的结果作为计数。
示例
#include<iostream> using namespace std; //返回偶数长度序列的计数 int findSeq(int n){ int nCi=1; //nC0=1 int ans = 1; for (int i = 1; i<=n ; i++){ //nCi=(nCi-1)*(nCi/nCi-1) //nCi/nC(i-1)=(n+1-i)/i; nCi = (nCi * (n+1-i))/i; ans += nCi*nCi; } return ans; } int main(){ int bits = 2; cout << "Count of binary sequences such that sum of first and second half bits is same: "<<findSeq(bits); return 0; }
输出结果
Count of binary sequences such that sum of first and second half bits is same: 6