求交集的地方借鉴了网上的方法,由于s[i][0]与s[i][1]是没有交集的,因此将他们分别和s[k][0],s[k][1]取交集即可,不用担心重复问题,另外数值容易出现误差,因此尽量自己先计算成分数形式,防止机器计算的时候精度变化
#include<stdio.h>
double d;
typedef struct {
double l;
double r;
}interval;
interval intersection(interval a, interval b){
interval c;
if(a.l > b.l){
c.l = a.l;
}
else{
c.l = b.l;
}
if(a.r < b.r){
c.r = a.r;
}
else{
c.r = b.r;
}
if(c.l >= c.r){
c.l = c.r = 0;
}
return c;
}
interval solve1(double a,double b){
interval in1;
in1.r=(a-d)/b;
in1.l=(a+d-360)/b;
if(in1.l>=in1.r) in1.l=in1.r=0;
if(in1.l<0.0) in1.l=0;
if(in1.r>60.0) in1.r=60.0;
return in1;
}
interval solve2(double a,double b){
interval in2;
in2.r=(360-d+a)/b;
in2.l=(a+d)/b;
if(in2.l>=in2.r) in2.l=in2.r=0;
if(in2.l<0.0) in2.l=0;
if(in2.r>60.0) in2.r=60.0;
return in2;
}
double happytime(int h,int m){
interval ss[3][2];
interval result;
int i,j,k;
double r=0;
double a1,a2,a3,b1,b2,b3;
a1=30.0*h-5.5*m;
b1=11.0/120.0;
a2=6.0*m;
b2=5.9;
a3=30*h+0.5*m;
b3=719.0/120.0;
ss[0][0]=solve1(a1,b1);
ss[0][1]=solve2(a1,b1);
ss[1][0]=solve1(a2,b2);
ss[1][1]=solve2(a2,b2);
ss[2][0]=solve1(a3,b3);
ss[2][1]=solve2(a3,b3);
for(i=0; i<2; i++)
for(j=0; j<2; j++)
for(k=0; k<2; k++){
result = intersection(intersection(ss[0][i], ss[1][j]),ss[2][k]);
r += (result.r-result.l); }
r=r>0?r:0;
return r;
}
main(){
double result;
int h,m;
while(scanf("%lf",&d)){
if(d<0) break;
result=0;
for(h=0;h<12;h++)
for(m=0;m<60;m++)
result+=happytime(h,m);
printf("%.3f\n",100*result/43200);
}
}