用C语言计算听到的礼炮声 哎呦喂 这哪是编程啊 这比数学还难。。求指教
发布网友
发布时间:2022-04-26 09:09
我来回答
共3个回答
热心网友
时间:2023-10-09 04:01
#include "stdio.h"
int main()
{
int n,a,b,c;
int ta,tb,tc,na,va,vb,vc;
scanf("%d%d%d%d",&n,&a,&b,&c);
ta=n*a;//a鸣n次用的总时间
tb=n*b;//b鸣n次用的总时间
tc=n*c;//c鸣n次用的总时间
na=n*3;//没有重复时,观众会听到的次数
va=a;
vb=b;
vc=c;
//是否会一起鸣炮
if(a==b==c)
{
printf("%d\n",n);
return 0;
na=na-2;
}
else if(a==b || a==c || b==c)
na--;
//这个循环模拟,鸣炮的过程,若有abc一起鸣,则na减2,若有两个一起鸣,则na减1
while(1)
{
if(a<ta && b<tb && c<tc)
{
if(a<=b&&a<=c)
{
a+=va;
if(a==b==c)
na--;
else if(a==b || a==c)
na--;
}
else if(b<=a&&b<=c)
{
b+=vb;
if(a==b==c)
na--;
else if(b==a || b==c)
na--;
}
else if(c<=a&&c<=b)
{
c+=vc;
if(a==b==c)
na--;
else if(c==a || c==b)
na--;
}
}
else if(a<ta && b<tb)
{
if(a<=b)
{
a+=va;
if(a==b)
na--;
}else{
b+=vb;
if(a==b)
na--;
}
}
else if(a<ta && c<tc)
{
if(a<=c)
{
a+=va;
if(a==c)
na--;
}else{
c+=vc;
if(a==c)
na--;
}
}
else if(b<tb && c<tc)
{
if(c<=b)
{
c+=vc;
if(c==b)
na--;
}else{
b+=vb;
if(c==b)
na--;
}
}
else
break;
}
printf("%d\n",na);
return 0;
}
热心网友
时间:2023-10-09 04:02
利用最小公倍数能够求出重叠的炮声,然后用总的炮声减去即可。
具体代码如下:
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
int Lcm ( int a, int b );
main()
{
int st; //重叠的炮声
st=5*21/Lcm(5,6)+6*21/Lcm(6,7)+5*21/Lcm(5,7); //利用最小公倍数求重叠的炮声
printf("n=%d",21*3-st);
system("pause");
}
//函数功能:输出两个数的最小公倍数
int Lcm ( int a, int b )
{
int i;
for (i= a; i<=a*b ; i++ )
{
if ( i % a == 0 && i % b ==0 )
break;
}
return i;
}
热心网友
时间:2023-10-09 04:02
看我的解法,空间换时间。就是多占用存储空间。但是时间复杂度很好。
int max = a>b?(b>c?a:(a>c?a:c)) : (b>c?b:c)); //求出abc最大值
int lenth = max*n;
int* temp = (int*)new(sizeof(int)*lenth); //分配一个int数组 元素个数为n*max
memset(temp,0, lenth); //数组值全部置为0
int idx = 0;
while(idx < a) temp[idx++*a] = 1; //代表此处鞭炮响
idx = 0;
while(idx < b) temp[idx++*a] = 1;
idx = 0;
while(idx < c) temp[idx++*a] = 1;
int count = 0;
while(lenth--){ //统计响声次数,因为都是在一个数组里,所以可以把一起响的响声当成一次.
if(temp[lenth])
count++;
}
printf("总共%d响声", count);