题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5387
题目大意:给出一个时间,判断时针、分针、秒针三者之间的角度。
思路:直接算出三个指针相对于12时的角度,然后相减。
不过题目中要求以分数形式表现,如果以小数计算的话,就难以再表示分数了。所以做个处理:将三个角度都乘以一个比较大的数。这样做的目的是为了确保在运算的时候是整数,从而避免因为小数运算带来的精度误差。最后以分数形式表示答案的时候,可以算出分子和分母的gcd,然后同除以gcd即可。
感觉方法略麻烦。。。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int main()
{
int T,i,j,k;
double hh,mm,ss,hd,md,sd;
scanf("%d",&T);
while(T--)
{
scanf("%lf:%lf:%lf",&hh,&mm,&ss);
if(hh>=12)hh=hh-12;
hh=hh*21600;
mm=mm*21600;
ss=ss*21600; //同乘以一个比较大的数。
sd=ss/60*360;
md=mm*6+ss*0.1;
hd=hh*30+mm*0.5+ss/120; //计算三个角度。
int hm,hs,ms;
int x,y,z;
hm=fabs(hd-md);
hs=fabs(hd-sd);
ms=fabs(md-sd);
if(hm>3888000)hm=7776000-hm;
if(hs>3888000)hs=7776000-hs;
if(ms>3888000)ms=7776000-ms;
//对钝角的处理,如果角度差大于180,就处理为小于180度的角。(这里180*21600=3888000)
x=__gcd((int)hm,21600);
y=__gcd((int)hs,21600);
z=__gcd((int)ms,21600); //计算gcd
if((int)hm==0)x=0;
if((int)hs==0)y=0;
if((int)ms==0)z=0; //如果有角度为0的,就不需要计算gcd了。
int f1,f2,f3;
f1=f2=f3=0;
if(x==21600)f1=1;
if(y==21600)f2=1;
if(z==21600)f3=1;
if(f1)printf("%d ",(int)hm/21600);
else if(x!=0)printf("%d/%d ",(int)hm/x,21600/x);
else printf("0 ");
if(f2)printf("%d ",(int)hs/21600);
else if(y!=0) printf("%d/%d ",(int)hs/y,21600/y);
else printf("0 ");
if(f3)printf("%d \n",(int)ms/21600);
else if(z!=0)printf("%d/%d \n",(int)ms/z,21600/z);
else printf("0 \n");
}
return 0;
}