给你一个角度,求时钟三条针之间都不小于这个角度的时间占一天中的百分之几。
做法:求出两两之间的区间,求并集。
#include <stdio.h>
#include <math.h>
double hm=11/120.0,ms=59/10.0,hs=719/120.0; //求出相对角速度
double Thm=43200/11.0,Tms=3600/59.0,Ths=43200/719.0; //相对周期
double max(double x,double y,double z)
{
if(x>=y&&x>=z)
return(x);
else if(y>=z)
return y;
return z;
}
double min(double x,double y,double z)
{
if(x<=y&&x<=z)
return(x);
else if(y<=z)
return y;
return z;
}
int main()
{
double angle,sum;
double p[3],q[3];
double e[3],s[3];
while(scanf("%lf",&angle),fabs(angle+1)>=0.00001)
{
sum=0.0;
p[0]=angle/hm;
p[1]=angle/ms;
p[2]=angle/hs;
q[0]=(360-angle)/hm;
q[1]=(360-angle)/ms;
q[2]=(360-angle)/hs;
for(e[0]=p[0],s[0]=q[0]; s[0]<=43200.00001; e[0]+=Thm,s[0]+=Thm) //暴力求并集
{
for(e[1]=p[1],s[1]=q[1]; s[1]<=43200.00001; e[1]+=Tms,s[1]+=Tms)
{
if(e[1]>s[0])break;
if(s[1]<e[0])continue;
for(e[2]=p[2],s[2]=q[2]; s[2]<=43200.00001; e[2]+=Ths,s[2]+=Ths)
{
if(e[2]>s[0]||e[2]>s[1])break;
if(s[2]<e[0]||s[2]<e[1])continue;
double start=max(e[0],e[1],e[2]);
double end=min(s[0],s[1],s[2]);
if(end>start)sum+=(end-start);
}
}
}
printf("%.3lf\n",sum*100.0/43200.0);
}
return 0;
}