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

被折叠的 条评论
为什么被折叠?



