这个方法我是参考网上大神写的代码。这一题比较难。看了很久没看懂。没想到最后使用了角速度这个概念。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
/*
// 秒针速度 s = °/s 分针速度 m = /° /s 时针 h = /° /s
const double SH = / , SM = / , MH = / ;
const double tSH = / , tSM = / , tMH = / ;
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 != -)
{
double bSH, bSM, bMH, eSH, eSM, eMH, Begin, End, Sum = ;
bSH = D / SH;
bSM = D / SM;
bMH = D / MH;
//计算第一次满足条件的时间(开始时间)
eSH = ( - D) / SH;
eSM = ( - D) / SM;
eMH = ( - D) / MH;
//计算第一次不满足条件的时间(结束时间)
for (double b3 = bSH, e3 = eSH; e3 <= ; b3 += tSH, e3 += tSH)
{
for (double b2 = bMH, e2 = eMH; e2 <= ; b2 += tMH, e2 += tMH)
{
if (e2 < b3) //判断是否有交集
continue;
if (b2 > e3)
break;
for (double b1 = bSM, e1 = eSM; e1 <= ; 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 / );
}
return ;
}*/