日期:2025年3月15日
ZeroJudge 題目連結:f706. 時區 (Zone)
解題想法
這題需要注意輸出的格式,分、秒如果只有個位數,前面需要補0。
Python 程式碼
使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
import sys
d = 5400 # 1h30' = 5400"
a = 129600 # 36h = 129600"
for line in sys.stdin:
h, m, s, t = map(int, line.split()) # 時、分、秒、向東或西移動幾個時區
if t == -24 or t == 24: # 特例,向東或西繞一圈回到原時區
print(f"{h:d}:{m:02d}:{s:02d}") # 印出讀到的數值即可,分和秒要有2位數
continue # 繼續找下一組
s += h*3600 + m*60 # 先全部換成秒
s += t*d # 依照移動的時區加或減秒數
s = (s+a)%a # 處理可能回到前一天或進到下一天的問題
h = s//3600 # 計算小時
s %= 3600 # 計算小時之後剩下的秒數
m = s//60 # 計算分鐘
s %= 60 # 計算分鐘之後剩下的秒數
print(f"{h:d}:{m:02d}:{s:02d}") # 印出答案,分和秒要有2位數
C++ 程式碼
因為分和秒輸出時要固定為2位數,如果只有1位數前面要補0,使用 cstdio 函式庫的 printf 會比較方便。使用時間約為 2 ms,記憶體約為 88 kB,通過測試。
#include <cstdio>
using namespace std;
int main() {
const int d = 5400, a = 129600; // 1h30' = 5400"; 36h = 129600"
int h, m, s, t; // 時、分、秒、向東或西移動幾個時區
while(scanf("%d %d %d %d", &h, &m, &s, &t) != EOF) {
if (t == -24 || t == 24) { // 特例,向東或西繞一圈回到原時區
printf("%d:%02d:%02d", h, m, s); // 印出讀到的數值即可,分和秒要有2位數
continue; // 繼續找下一組
}
s += h*3600 + m*60; // 先全部換成秒
s += t*d; // 依照移動的時區加或減秒數
s = (s+a)%a; // 處理可能回到前一天或進到下一天的問題
h = s/3600; // 計算小時
s %= 3600; // 計算小時之後剩下的秒數
m = s/60; // 計算分鐘
s %= 60; // 計算分鐘之後剩下的秒數
printf("%d:%02d:%02d", h, m, s); // 印出答案,分和秒要有2位數
}
return 0;
}
如果要用 cout 輸出2位數並且在1位數前面補0,需要引入 iomanip 函式庫,並用第 11 及 22 行的寫法才行。使用時間約為 4 ms,記憶體約為 324 kB,通過測試。
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
const int d = 5400, a = 129600; // 1h30' = 5400"; 36h = 129600"
int h, m, s, t; // 時、分、秒、向東或西移動幾個時區
while(cin >> h >> m >> s >> t) {
if (t == -24 || t == 24) { // 特例,向東或西繞一圈回到原時區
cout << h << ":"; // 印出讀到的數值即可,分和秒要有2位數
cout << setfill('0') << setw(2) << m << ":" << setfill('0') << setw(2) << s << "\n";
continue; // 繼續找下一組
}
s += h*3600 + m*60; // 先全部換成秒
s += t*d; // 依照移動的時區加或減秒數
s = (s+a)%a; // 處理可能回到前一天或進到下一天的問題
h = s/3600; // 計算小時
s %= 3600; // 計算小時之後剩下的秒數
m = s/60; // 計算分鐘
s %= 60; // 計算分鐘之後剩下的秒數
cout << h << ":"; // 印出讀到的數值即可,分和秒要有2位數
cout << setfill('0') << setw(2) << m << ":" << setfill('0') << setw(2) << s << "\n";
}
return 0;
}
沒有留言:
張貼留言