0 120 90 -1
100.000 0.000 6.251
http://wenku.baidu.com/view/7fd92105e87101f69e31959a.html
http://baike.baidu.com/view/1389109.htm
http://www.cnblogs.com/doubleming/archive/2012/10/17/2727502.html
简略地看了看上面的资料,有点多,反而有些一叶障目,不见泰山的感觉,不过没有关系,至少还是有一些了解的.为了更感性地认识时钟问题,我们先来个钟,如下所示#include<stdio.h> struct Range //happy time区间(s) { double low; //单位是秒 double high; }; //解不等式: low < |as+b| <up s为(未知数)秒,a,b为系数,我们假设hour,minute已知道 Range SolveInequality(double a,double b,double low,double up) { Range R; if( a > 0) { R.low = (low-b)/a ; R.high = (up - b)/a; } else if( a < 0 ) { R.low = (up - b)/a; R.high = (low - b)/a; } if( R.low < 0) R.low = 0 ; //R的区间取值范围是[0,60],单位秒 if( R.high > 60) R.high = 60 ; if( R.low >= R.high ) R.low = R.high = 0 ; return R ; } // 求最三个数的大值 double Max(double a,double b,double c) { double Temp = a > b ? a : b ; return Temp > c ? Temp : c ; } //求三个数的最小值 double Min(double a,double b,double c) { double Temp = a < b ? a : b ; return Temp < c ? Temp : c ; } //求三个区间的交集 Range Intersection(const Range& a,const Range& b,const Range& c) { Range R; R.low = Max(a.low , b.low , c.low ) ; R.high = Min(a.high , b.high , c.high ) ;//一开始笔误写成a.high,b.high,b.high,太悲剧了 if( R.low >= R.high ) R.low=R.high=0 ; return R; } double HappyTime(double h,double m,double low ,double up) { Range R[3][2]; double a,b; a = 1/120.0-1/10.0; b = h * 30.0 + m /2.0 - m * 6.0; //求绝对值不等式l<|a|<r 可分以下两式子l<a<r或a<-a<r, R[0][0] = SolveInequality(a,b,low,up); R[0][1] = SolveInequality(-a,-b,low,up); a=1/120.0 - 6.0,b=30.0*h+m/2.0; R[1][0] = SolveInequality(a,b,low,up); R[1][1] = SolveInequality(-a,-b,low,up); a=1/10.0 - 6.0,b=6.0*m; R[2][0] = SolveInequality(a,b,low,up); R[2][1] = SolveInequality(-a,-b,low,up); double TimeSum=0.0; Range Section; //我们假设时针,分针此时已经固定好位置,我们现在的目标是确定秒针的区间, //就能确定在这种时分针的布局下,秒针有多少happy time.求秒针的区间模拟手算 //先由 low<|hw -mw|<up; 可算出2个区间 // low<|hw - sw|<up; 可算出2个区间 // low<|sw - mw|<up ; 可算出2个区间 然后从每一组取出一个区间进行组合,最后再合并 for(int i=0;i<2;++i) { for( int j=0;j<2;++j) { for(int k=0;k<2;++k) { //交三个区间的交集 Section = Intersection(R[0][i],R[1][j],R[2][k]); TimeSum += (Section.high - Section.low) ; } } } return TimeSum; } int main() { double TimeSum=0; double degree ; while(scanf("%lf",°ree)!=EOF && degree != -1) { TimeSum=0; for(int h=0;h<12;++h) { for(int m=0;m<60;++m) TimeSum += HappyTime(h,m,degree,360-degree); } //除以24*60*60*100% printf("%.3lf\n",TimeSum/432.0); } return 0; }