题意:多组输入,给你钟表的小时数h、分钟数m、秒数s,再给你一个角度a,问你下一次时针和分针所成的角度为a的时候是几时几分。
思路:因为是下一次角度为a的时候,所以我们要首先排除当前时刻角度已成a的干扰,+1s,然后开始分析:
考虑时针:每小时30°,每分钟
12
1
2
°,每秒
1120
1
120
°;
考虑分针:每分钟6°,每秒
110
1
10
°;
观察到时针每走1°,分针走12°,转换成分针去追时针的问题。
为避免浮点型的精度问题,挑最小的数把它变成整数,即所有度有关的*120.
设分钟与时针所成角为θ,因为a的范围为0~180,所以我们可以分成两大类:
θ>=180°:
(1) (360-θ)>=a时,这时需要经过(θ-a)/11的时间。 除以11是因为分针比时针多走了11
(2) (360-θ)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int mo=120*360;
const int half=120*180;
int main()
{
int h,m,s,sum=1,a,d,ans;
while(scanf("%d:%d:%d",&h,&m,&s)!=EOF)
{
cin>>a;
s++;
a*=120;
h=(h*3600+m*60+s);
m=(720*m+12*s)%mo;
d=(h+mo-m)%mo;
if(d>=half)
{
if(a>=(mo-d))
ans=h+(a-mo+d)/11;
else
ans=h+(d-a)/11;
}
else if(d>=a)
ans=h+(d-a)/11;
else
ans=h+(d+a)/11;
printf("Case #%d: %02d:%02d:%02d\n",sum++,ans/3600%12,ans/60%60,ans%60);
}
return 0;
}