这个方法我是参考网上大神写的代码。这一题比较难。看了很久没看懂。没想到最后使用了角速度这个概念。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
/*
// 秒针速度 s = 6°/s 分针速度 m = 1/10° /s 时针 h = 1/120° /s
const double SH = 719.0 / 120, SM = 59.0 / 10, MH = 11.0 / 120;
const double tSH = 43200.0 / 719, tSM = 3600.0 / 59, tMH = 43200.0 / 11;
double Min(double a, double b, double c)
{
return min(a, min(b, c));
}
double Max(double a, double b, double c)
{
return max(a, max(b, c));
}
int main()
{
double D;
while (cin >> D && D != -1)
{
double bSH, bSM, bMH, eSH, eSM, eMH, Begin, End, Sum = 0;
bSH = D / SH;
bSM = D / SM;
bMH = D / MH;
//计算第一次满足条件的时间(开始时间)
eSH = (360 - D) / SH;
eSM = (360 - D) / SM;
eMH = (360 - D) / MH;
//计算第一次不满足条件的时间(结束时间)
for (double b3 = bSH, e3 = eSH; e3 <= 43200.000001; b3 += tSH, e3 += tSH)
{
for (double b2 = bMH, e2 = eMH; e2 <= 43200.000001; b2 += tMH, e2 += tMH)
{
if (e2 < b3) //判断是否有交集
continue;
if (b2 > e3)
break;
for (double b1 = bSM, e1 = eSM; e1 <= 43200.000001; b1 += tSM, e1 += tSM)
{
if (e1 < b2 || e1 < b3)
continue;
if (b1 > e2 || b1 > e3)
break;
Begin = Max(b1, b2, b3); //开始时间取最大,以满足全部要求
End = Min(e1, e2, e3); //结束时间取最小,以满足全部要求
Sum += (End - Begin);
}
}
}
printf("%.3lf\n", Sum / 432);
}
return 0;
}*/