这道题目刚开始想到的是利用循环对每一秒进行判断,求出符合要求的秒数占总秒数的百分比。但是这样,在90度的时候总是和实例输出不一样。
后来参考了这篇博客才知道怎么回事 http://www.cnblogs.com/Lyush/archive/2011/11/29/2266925.html
原来这道题目想要考的是对连续时间的统计冰粉独立的每秒。
整个思路如下:
1先算出每根针的角速度 h,m,s
2算出每两根针的夹角速度差 h_m,h_s,s_m
3.算出没两根针角速度的变化周期 thm, ths,tsm
4.根据D,求出起始时间bsh,esh,bhm,shm,bsm,esm 公式是360/对应的变化周期
5.从起始时间开始,不断循环找符合要求的时间段
可以结合这幅图看下代码理,画的很挫,见谅哈!
这里需要注意的地方
1最好是从周期最大的到周期最小的
2.外面的用bt条件判断,否则最终会漏掉最后的部分时间
import java.util.Scanner; public class Main { //角速度差 public static double s_h=719.0/120,s_m=59.0/10,h_m=11.0/120; //两根针角度变化周期 public static double tsh = 43200.0 / 719, tsm = 3600.0 / 59, tmh = 43200.0 / 11.0; public static double max(double a,double b,double c) { double t=a; if(b>t) t=b; if(c>t) t=c; return t; } public static double min(double a,double b,double c) { double t=a; if(b<t) t=b; if(c<t) t=c; return t; } public static void main(String[] args) { Scanner ss=new Scanner(System.in); double d=0.0; while ((d=ss.nextDouble())!=-1) { //第一次满足条件的时间 double bsh=d/s_h; double esh=(360-d)/s_h; double bsm=d/s_m; double esm=(360-d)/s_m; double bhm=d/h_m; double ehm=(360-d)/h_m; double begin=0.0; double end=0.0; double total=0.0; for(double bt3=bsh,et3=esh; bt3<=43200.0;bt3+=tsh,et3+=tsh) { for(double bt2=bsm,et2=esm;bt2<=43200.0;bt2+=tsm,et2+=tsm) { if(et2<bt3)//剔除一些不符合要求的 可以看上面的图 continue; if(bt2>et3) break; for(double bt1=bhm,et1=ehm;et1<=43200.0;bt1+=tmh,et1+=tmh) { if(et1<bt2 || et1<bt3) continue; if(bt1>et2 || bt1>et3) break; begin=max(bt1, bt2, bt3); end =min(et1, et2, et3); total+=end-begin; } } } System.out.println(String.format("%.3f", total/432)); } } }