# Math# Geometry# Simulation

d095 - 00579 - ClockHands

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算時鐘上時針和分針之間的最小角度。輸入為一系列的時間,格式為 H:M,其中 H 為小時 (1-12),M 為分鐘 (00-59)。輸入結束條件為 0:00。輸出為時針和分針之間的最小正角度,精確到小數點後三位。

解題思路

解題思路是根據給定的時間計算時針和分針的度數,然後計算它們之間的差的絕對值。由於題目要求最小正角度,因此需要考慮兩種情況:如果差值大於 180 度,則用 360 度減去差值;否則,直接使用差值。時針每小時移動 30 度 (360/12),分針每分鐘移動 6 度 (360/60)。時針的度數還需要加上分針移動所帶來的影響,即 m/12。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入的時間數量。
  • 空間複雜度: O(1),因為只使用了常數級別的額外空間。

程式碼

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
int main(){
	ios::sync_with_stdio(false);
    cin.tie(NULL);
	string a;
	double h,m;
	cout << fixed <<  setprecision(3);
	while(cin >> a){
		if(a[0]=='0')
			break;
		else if(a.length()==4){
			h=a[0]-48;
			m=(a[2]-48)*10+a[3]-48;
		}
		else{
			h=(a[0]-48)*10+a[1]-48;
			m=(a[3]-48)*10+a[4]-48;
		}
		m*=6;
		h=h*30+m/12;
		if(m>h){
			if(m-h>180)
				cout << 360-(m-h) << endl;
			else
			cout << m-h << endl;
		}
		else{
			if(h-m>180)
				cout << 360-(h-m) << endl;
			else
			cout << h-m << endl;
		}
	}
}

Discussion