這是别人的代碼,沒研究透,先儲存了
#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的百分比
}
}