天天看點

杭電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的百分比

 }

}