每日一练20203.5.17

该程序读取两个等长整数数组,计算当对两个数组的每个对应元素执行或运算时,结果为1的个数。关键在于处理第二行值为0的位置,其中a2表示第二行0且第一行0的计数,b2表示第二行0但第一行1的计数。通过a1、a2、b1和b2的关系计算总情况数,减去重复部分得出答案。代码在本地环境运行正常,但在特定在线编译器可能遇到问题。
摘要由CSDN通过智能技术生成

#include<stdio.h>

int main()
{
	int len,a2=0,b2=0,a1=0,b1=0;
	scanf("%d",&len);
	
	int arr1[len],arr2[len];
	
	for(int i=0;i<len;i++)
	{
		scanf("%d",&arr1[i]);
		if(arr1[i]==1) a1=a1+1;
		else b1=b1+1;
	}
	for(int i=0;i<len;i++)
	{
		scanf("%d",&arr2[i]);
		if(arr2[i]==0)
		{
			if(arr1[i]==0)
			{
				a2=a2+1;
			}
			else b2=b2+1;
		}
	}
	int sum;
	sum=a2*a1+b2*b1-a2*b2;
	printf("%d",sum);	
}

本道题的解题思路呢很简单,其实在进行“or”运算之后,起决定性作用的是二进制序列里面的“1”。

按照题目要求,将两个序列摆好,发现,只要第二行的任意一个位置是“1”,那么进行“or”运算之后,结果肯定是“1”。所以问题的关键是第二行为“0”的位置有多少个,因为,这些位置是可以依据第一行的位置上的数字而改变的。

于是可以从第二行为零的位置和第一行对应位置的关系入手:

设第二行为“0”的位置上,对应的第一行也为“0”的数目为a2,第一行为“1”的数目为把把b2

第一行“1”的个数为a1,“0”的个数为b1

则情况总数为:sum=a1*a2(1和0调换)+b1*b2(0和1调换)-   a2*b2(重复部分)

notes:本代码在本地dev可以运行,但是csdn的编译器就是 通过不了。如果是有问题,希望有小伙伴可以提示一下。     

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值