1727: 鐘錶的指針
Time Limit: 1 Sec Memory Limit: 64 MB
Description
鐘錶作為計時報時工具在我們的日常生活中必不可少。相信每個學習程序設計的人都想設計一款美觀實用且具有個性特色的鐘表軟件。如果要設計出美觀大方的圖形化用户界面,對程序設計初學者來説有一定的難度(以後通過自己的努力一定能行哦!)。但是,我們可以拋開圖形化用户界面的設計,而直接進入到關鍵邏輯部分的設計。繪製鐘錶的關鍵邏輯是根據當前時間,確定時針、分針、秒針的位置。 給定從某個指定日期的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;
}