题目大意
给定一个时间T,一个度数D,求在T时间之后,时针和分针的角度恰为D,求此时间。
思路
尽量不要算除法,会有精度问题(某些二分除外),将除法转化成乘法问题。每120/11 秒对应 时分针相差一度。然后每次增加120秒,同时将此时刻秒数*11(避免除法导致精度误差),进而继续判断如果此时的度数和目标度数是否相等并且当前时间T和上次时间t是否满足T>t,如果都满足条件,则退出循环。输出答案。注意在输出答案的时候要令答案除11,已得到正确答案。
技巧
fabs()是求浮点数绝对值,abs()是求整数绝对值。
scanf("%d:%d")其中可以输入3:3。
printf("%02d",k)%2d是将数字按宽度为2,采用右对齐方式输出,若数据位数不到2位,则左边补空格。这里是补0。"%02d"可以用"%.2d"替换,效果一样。
代码
#include<cstdio>
int main()
{
int h,m,s;
int h_s,m_s,a;
int cnt=1;
while(scanf("%d:%d:%d",&h,&m,&s)==3){
scanf("%d",&a);
h_s=h*3600+m*60+s;
h_s*=11;
a*=11;
int i,tt=0,ttt=0;
for(i=120;;i+=120){
tt+=11;
if(tt>360*11) ttt=tt%(360*11);
else ttt=tt;
if(ttt>180*11) ttt=360*11-ttt;
if(ttt==a&&i>h_s)break;
}
i %= 43200*11; //43200=120 * 360
int hh=i/(3600*11);
int mm=(i-hh*(3600*11))/(60*11);
int ss=(i-hh*(3600*11)-mm*(60*11))/11;
hh %= 24;
printf("Case #%d: %02d:%02d:%02d\n",cnt++,hh,mm,ss);
}
}