创新题:关于炮台计数原理

博客探讨三门炮(发射周期分别为5秒、6秒、7秒,各21发)在140秒内共产生多少次可听炮声的问题,核心在于处理时间重合导致的重复计数。重点分析三种解法:数组标记法、逻辑或遍历法、以及基于容斥原理的数学公式法(|A∪B∪C|=|A|+|B|+|C|−|A∩B|−|A∩C|−|B∩C|+|A∩B∩C|),强调算法设计中去重与效率的权衡。

有3门大炮,每门有21发,A炮每5秒发射,B炮每6秒发射,C炮每7秒发射,他们第一炮在同一时刻放出,问一共可以听到多少声炮声?
有3种写法,第一种是创建局部变量,给每个时间戳进行标记,然后在最后一个循环中把时间戳全部统计;
第二种是用或且来统计:A||B||C就表示一共出现多少次,因为只要有一个就是真的,所以它就包含了重合的情况。
第三种就纯是翻译互斥公式;把A,B,C,AB,AC,BC,ABC全部的次数标识出来
A+B+C-AB-AC-BC-ABC

第一种写法一定要用局部变量,因为他们是互相没有影响的
#include<stdio.h>
int main()
{
int count=0;
int time[141]={0};//最多有140秒,用141就是为了防止越界
for(int i=0; i<=20;i++)//第一发已经发射了,剩下20发
{
time[i5]=1;
}
for(int i=0;i<=20;i++)
{
time[i
6]=1;
}
for(int i=0;i<=20;i++)
{
time[i*7]=1;
}

for(int i=0;i<=140;i++)
{
if( time[i]==1)
{
count++;
}
}
printf(“%d”,count);

return 0;
}

#include<stdio.h>
int main()
{
int count=0;
int a=0;
int b=0;
int c=0;
int t=0;
for(t=0;t<=140;t++)
{
a=(t%50&&t<=100);//这个代表合理的每5秒的发射炮数
b=(t%6
0&&t<=120);
c=(t%7==0&&t<=140);
while(a||b||c)
{
count++;
}
}
printf(“%d”,count);
return 0;
}

#include<stdio.h>
int main()
{
in ret=0;
int a=0;
int b=0;
int c=0;
int ab=0;
int ac=0;
int bc=0;
int abc=0;
for(t=0;t<=140;t++)
{
int cod1=(t%50&&t<=100);
int cod2=(t%6
0&&t<=120);
int cod3=(t%7==0&&t<=140);
if(cod1)
{
a++;
}
if(cod2)
{
b++;
}
if(cod3)
{
c++;
}
if(cod1&&cod2)
{
ab++;
}
if
{
ac++;
}
if(cod2&&cod3)
{
bc++;
}

ret=a+b+c-ab-ac-bc+abc;
printf(“%d”,ret);
return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值