甲、乙、丙三人同时放鞭炮,甲每隔A秒放一个,乙每隔B秒放一个,丙每隔C秒放一个,他们各自放D个。对任意给定的A、B、C和D,求能听到多少声鞭响。
解决方案:5分
弄错了,是每隔ABC秒放一个
共放D个
这样 每个时间间隔是1秒
D个最多放 D*max(A,B,C) 秒
各人 分别放 A*D秒,B*D秒,C*D秒
假设第一响在同一时间
那么甲 每隔A秒,乙每隔B秒,丙每隔C 会响一声鞭炮
如果三者或者两者同时在放,只能听到一声响。
如果A=B=C
那么只能听到 D 声响
如果 A,B,C 互不相等,并且互质并且D*A, 不等于 K*B,K*C,D*B亦然,D*C亦然,
那么可以听到 3D – 2 声响
如果有公因子,那么就会少一点
所以最少D 最多3D-2
至于编程设置三个变量表示每个人点放的鞭炮个数,设置一个数表示时间
每当A,B,C 秒各放一个鞭炮,听到 每秒有人放炮则听到一声响,无人则没听到最后统计一下听到几声响即可
共放D个
这样 每个时间间隔是1秒
D个最多放 D*max(A,B,C) 秒
各人 分别放 A*D秒,B*D秒,C*D秒
假设第一响在同一时间
那么甲 每隔A秒,乙每隔B秒,丙每隔C 会响一声鞭炮
如果三者或者两者同时在放,只能听到一声响。
如果A=B=C
那么只能听到 D 声响
如果 A,B,C 互不相等,并且互质并且D*A, 不等于 K*B,K*C,D*B亦然,D*C亦然,
那么可以听到 3D – 2 声响
如果有公因子,那么就会少一点
所以最少D 最多3D-2
至于编程设置三个变量表示每个人点放的鞭炮个数,设置一个数表示时间
每当A,B,C 秒各放一个鞭炮,听到 每秒有人放炮则听到一声响,无人则没听到最后统计一下听到几声响即可
解决方案:5分
分别求 AB , AC, BC, ABC的最小公倍数
这四个值分别为 LAB, LAC, LBC, LABC
听到的次数就是
3* D – D* min(A, B) / LAB – D * min(B, C) / LBC – D * min(AC) / LAC + D * min(A, B, C) / LABC
这四个值分别为 LAB, LAC, LBC, LABC
听到的次数就是
3* D – D* min(A, B) / LAB – D * min(B, C) / LBC – D * min(AC) / LAC + D * min(A, B, C) / LABC
解决方案:10分
//甲、乙、丙三人同时放鞭炮,甲每隔A秒放一个,乙每隔B秒放一个,丙每隔C秒放一个,他们各自放D个。对任意给定的A、B、C和D,求能听到多少声鞭响。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() { int A,B,C,D; int maxABC,i,n; char *p; scanf("%d%d%d%d",&A,&B,&C,&D); maxABC=A; if (maxABC<B) maxABC=B; if (maxABC<C) maxABC=C; p=(char *)calloc(maxABC*D,sizeof(char)); for (i=0;i<D;i++) { p[A*i]=1; p[B*i]=1; p[C*i]=1; } n=0; for (i=0;i<maxABC*D;i++) if (p[i]) n++; free(p); printf("%d\n",n); return 0; } //2 3 7 10 //23 //