天天看点

杭电ACM1006时钟指针角度问题

这是别人的代码,没研究透,先保存了

#include <stdio.h>

#include <stdlib.h>

double D;

int H,M;

double S, Total;

int signal;

double minimum;

double maximum;

void get_next()

{

 double HM,HS,MS; // HM是时针和分针的夹角, HS是时针和秒针的夹角, MS是分针和秒针的夹角

 double HL,ML,SL; // HL是时针的位置, ML是分针的位置, SL是秒针的位置

 double t1,t2,t3; // 临时值

 SL = 6*S; // 秒针的位置是6度乘以当前的秒数

 ML = 6*(M+S/60); // 分针的位置是6度乘以当前的分数 + 当前的秒数除以10

 HL = 30*(H+M/60.0+S/3600); // 时针的位置是30度乘以当前的小时数 + 分钟数除以2 + 秒数除以120

 HM = ML - HL; // 以分针在前, 算出分针和时针的夹角

 HS = SL - HL; // 以秒针在前, 算出秒针和时针的夹角

 MS = SL - ML; // 以秒针在前, 算出秒针和分针的夹角

 while(HM+1e-6>=D) HM -= 360; // 如果时针和分针的夹角 >= D, 那么减360

 while(HM+1e-6<D-360) HM += 360; // 如果时针和分针的夹角 < D-360, 那么加360

 while(HS+1e-6>=D) HS -= 360; // 下面的操作是一样的, 目的是把每个夹角控制在 D-360 到 D之间

 while(HS+1e-6<D-360) HS += 360; // 那样的话, 只要夹角小于-D, 他们就是Happy的

 while(MS+1e-6>=D) MS -= 360; // 如果在-D和D之间, 就不happy  

 while(MS+1e-6<D-360) MS += 360;

 if(HM>=-D||HS+1e-10>=-D||MS+1e-10>=-D) // 如果有任何一个夹角处于 -D到D之间

 {

  signal = 0; // 标记为Unhappy

  t1 = (D - HM)/(1.0/10 - 1.0/120); // 时针和分针需要经过t1才变得happy

  t2 = (D - HS)/(6-1.0/120); // 时针和秒针要经过t2才变得happy

  t3 = (D - MS)/(6-1.0/10); // 分针和秒针要经过t3才变得happy

  minimum = 0; // 下面是算t1, t2, t3的最大值

  if(HM>=-D) minimum = minimum > t1? minimum : t1;

  if(HS+1e-6>=-D) minimum = minimum > t2? minimum : t2;

  if(MS+1e-6>=-D) minimum = minimum > t3? minimum : t3;

  S += minimum; // 移动秒针到可能的happy处

  while(S>=60) // 恢复正常的表示方式

  {

   S-=60;

   M++;

  }

  while(M>=60) // 恢复正常的表示方式

  {

   M-=60;

   H++;

  }

  return;

 }

 else

 {

  signal = 1; // 标记为happy

  t1 = (-D - HM)/(1.0/10 - 1.0/120); // 时针和分针经过t1会变得unhappy

  t2 = (-D - HS)/(6-1.0/120); // 时针和秒针经过t2会变得unhappy

  t3 = (-D - MS)/(6-1.0/10); // 秒针和分针经过t3会变得unhappy

  maximum = 100000;  // 下面是算t1, t2, t3的最小值

  maximum = maximum < t1? maximum : t1;

  maximum = maximum < t2? maximum : t2;

  maximum = maximum < t3? maximum : t3;

  S += maximum; // 移动到unhappy处

  while(S>=60) // 恢复正常的表示方式

  {

   S-=60;

   M++;

  }

  while(M>=60) // 恢复正常的表示方式

  {

   M-=60;

   H++;

  }

  return;

 }

}

int main()

{

 while(scanf("%lf",&D)&&D!=-1) // 读取数字

 {

  if(D==0) // 特殊处理

  {

   printf("100.000\n");

   continue;

  }

  if(D>=120) // 特殊处理

  {

   printf("0.000\n");

   continue;

  }

  H = M = 0; // 初始化时间

  S = 0; // 初始化时间

  Total = 0; // Happytime

  while(1)

  {

   get_next(); // 得到下一个临界时间

   if(H>=12) break; // 如果超过12小时, 就不管了, 跳出

   if(signal) Total += maximum; // 如果从现在到下一个临界时间是Happy的, 就加上Maximum的Happy时间

  }

  printf("%.3lf\n",Total/432); // Total/432 % 就是总共happy的百分比

 }

}