题目链接: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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/aaaaacmer/article/details/47620521