题目来源:http://116.56.140.75:8000/JudgeOnline/problem.php?id=1727
1727: 钟表的指针
Time Limit: 1 Sec Memory Limit: 64 MBDescription
钟表作为计时报时工具在我们的日常生活中必不可少。相信每个学习程序设计的人都想设计一款美观实用且具有个性特色的钟表软件。如果要设计出美观大方的图形化用户界面,对程序设计初学者来说有一定的难度(以后通过自己的努力一定能行哦!)。但是,我们可以抛开图形化用户界面的设计,而直接进入到关键逻辑部分的设计。绘制钟表的关键逻辑是根据当前时间,确定时针、分针、秒针的位置。 给定从某个指定日期的0时0分0秒以来消逝的秒数,以及时针、分针、秒针的长度(即指针末端与中心的距离),要你编程计算出此时时针、分针、秒针末端的坐标以及角度。 说明:(1)坐标的中心在圆心。(2)x轴的正向指向3点正,y轴的正向指向12点整。(3)时分秒指针的角度是指由正x轴向逆时针旋转指针到指针位置所经过的角度,以“度”作为单位。取值范围在[0,360)。
Input
第一行包含3个整数,分别表示时分秒指针的长度。第二行包含一个整数n(1≤n≤40000),表示测试用例的个数。以下n行,每行一个整数k(1≤k≤1000000),表示从0时0分0秒起经过的秒数。
Output
按照输出样例格式输出。测试样例之间有一个空行。对于每个测试用例,第一行输出起点经过的秒数。第二、三、四分别输出时、分、秒针末端的x坐标、y坐标、角度(保留3位小数)。
Sample Input
1000 2000 3000
7
0
10
20
30
40
50
60
Sample Output
after 0 seconds
hour:0 1000 90.000
minute:0 2000 90.000
second:0 3000 90.000
after 10 seconds
hour:1 999 89.917
minute:34 1999 89.000
second:2598 1499 30.000
after 20 seconds
hour:2 999 89.833
minute:69 1998 88.000
second:2598 -1500 330.000
after 30 seconds
hour:4 999 89.750
minute:104 1997 87.000
second:0 -3000 270.000
after 40 seconds
hour:5 999 89.667
minute:139 1995 86.000
second:-2598 -1499 210.000
after 50 seconds
hour:7 999 89.583
minute:174 1992 85.000
second:-2598 1500 150.000
after 60 seconds
hour:8 999 89.500
minute:209 1989 84.000
second:0 3000 90.000
解析:找出时分秒的关系,以及坐标的计算,只是不知道x,y的精度要求是多少,求赐教
代码:
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
const double pi = 4 * atan(1);
int main()
{
int h, m, s;
cin >> h >> m >> s;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
cout << "after " << n << " seconds" << endl;
float hh = pi / 2 - pi*n / 21600;
float hhh = hh * 180 / pi;
hhh = hhh - ((int)hhh / 360) * 360;
cout << "hour:" << (int)(cos(hh)*h) << " " << (int)(sin(hh)*h) << " " << fixed << setprecision(3) << (hhh > 0 ? hhh : (hhh + 360)) << endl;
float mm = pi / 2 - pi*n / 1800;
float mmm = mm * 180 / pi;
mmm = mmm - ((int)mmm / 360) * 360;
cout << "minute:" << (int)(cos(mm)*m) << " " << (int)(sin(mm)*m) << " " << fixed << setprecision(3) << (mmm > 0 ? mmm : (mmm + 360)) << endl;
float ss = pi / 2 - pi*n / 30;
float sss = ss * 180 / pi;
sss = sss - ((int)sss / 360) * 360;
cout << "second:" << (int)(cos(ss)*s) << " " << (int)(sin(ss)*s) << " " << fixed << setprecision(3) << (sss > 0 ? sss : (sss + 360)) << endl;
cout << endl;
}
return 0;
}