https://yukicoder.me/problems/no/652
解法
https://yukicoder.me/submissions/238458
前の問題でやったのと同様に分にまとめて考える。
Sは "UTC+X", "UTC-X", "UTC+X.X", "UTC-X.X"のいずれかなので、これを場合分けする。
場合分けには+と-のどちらか、小数点はあるかどうかで判定すればいい。
各場合分け先でXの値を取る必要があるが、これにはc++ならsscanfを使うといい。
これを分に直して、今の時間をずらす。
最初のa時b分はUTC+9なので、9*60分だけ戻して標準時間に戻しておこう。
出力前に[0,24*60)の範囲外の場合は上手く範囲内に戻して、時間と分に直して出力する。
int a, b; string S; //--------------------------------------------------------------------------------------------------- void _main() { cin >> a >> b >> S; int t = a * 60 + b - 9 * 60; int n = S.length(); if (S[3] == '+') { if (S[n - 2] == '.') { // UTC+X.X int x, y; sscanf(S.c_str(), "UTC+%d.%d", &x, &y); t += x * 60 + y * 6; } else { // UTC+X int x; sscanf(S.c_str(), "UTC+%d", &x); t += x * 60; } } else { if (S[n - 2] == '.') { // UTC-X.X int x, y; sscanf(S.c_str(), "UTC-%d.%d", &x, &y); t -= x * 60 + y * 6; } else { // UTC-X int x; sscanf(S.c_str(), "UTC-%d", &x); t -= x * 60; } } if (t < 0) t += 2 * 24 * 60; t %= 24 * 60; int h = t / 60; int m = t % 60; printf("%02d:%02d\n", h, m); }