結果
| 問題 | No.652 E869120 and TimeZone |
| コンテスト | |
| ユーザー |
snow4726
|
| 提出日時 | 2018-03-13 22:10:00 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 1 ms / 1,000 ms |
| コード長 | 4,039 bytes |
| コンパイル時間 | 104 ms |
| コンパイル使用メモリ | 30,720 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-06-11 12:24:22 |
| 合計ジャッジ時間 | 949 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 30 |
ソースコード
/***********************************
日本の現在時刻から指定したタイムゾーンの
現地時間を求めるプログラム
入力:時 分 タイムゾーン
出力:現地時間
***********************************/
#include<stdio.h>
#include<stdlib.h>
#define MOJI 13 /* 最大入力文字数 */
int main(){
char* str; /* 入力データ */
char* a; /* 時 */
char* b; /* 分 */
char* utc; /* UTCの絶対値 */
char sym; /* UTCの符号(+,-) */
int i = 10; /* 入力文字列のUTCの数値からのカウンタ */
int j = 0; /* UTCの絶対値を抽出する為のカウンタ */
int hour,minutes; /* 入力時刻 時と分 */
double data; /* UTC(整数、小数両方を考慮) */ /* 日本と現地の時刻の差*/
int integer; /* 日本と現地の時刻の差の整数部分 */
double decimal; /* 日本と現地の時刻の差の小数部分 */
int local_hour; /* 現地時間の時 */
int local_minutes; /* 現地時間の分 */
int counter = 0; /* 時の増減カウンタ(0分を超えた場合と0分を遡った場合) */
str = (char*)calloc(MOJI+1+1,sizeof(char)); /* 最大文字数(MOJI)+改行コード+終端文字分だけポインタの領域確保*/
fgets(str,MOJI+1+1,stdin); /* 標準入力 */
utc = (char*)calloc(5,sizeof(char)); /* UTCの絶対値用のポインタの領域確保 */
a = (char*)calloc(3,sizeof(char)); /* 入力データの時(a)用のポインタの領域確保 */
b = (char*)calloc(3,sizeof(char)); /* 入力データの分(b)用のポインタの領域確保 */
/* 入力データから時(a)の文字列を読み込み、整数に変換 */
a[0] = str[0];
a[1] = str[1];
a[2] = '\0';
hour = atoi(a);
/* 入力データから分(b)の文字列を読み込み、整数に変換 */
b[0] = str[3];
b[1] = str[4];
b[2] = '\0';
minutes = atoi(b);
sym = str[9]; /* UTCの符号を読み込む */
/* 入力データのUTCの絶対値部分から入力データの末端まで文字列に格納 */
while( str[i] != '\n' && str[i] != '\0' ){
utc[j] = str[i];
i++;
j++;
}
utc[j] = '\0';
data = atof(utc); /* UTCの絶対値を小数として保存 */
if( sym == '-' ) data = 24.0 - data; /* UTCの符号がマイナスの場合は24時間から引いて調整 */
data -= 9.0; /* UTCを基準の日本のタイムゾーンの9で引いて差を求める */
integer = (int)data; /* 日本と現地の時の差(整数部分)を求める */
decimal = data - (double)((int)data); /* 日本と現地の分の差(小数部分)を求める */
/* 小数の誤差調整 */
if( decimal > 0 ) decimal += 0.0001;
if( decimal < 0 ) decimal -= 0.0001;
/* 現在の分に調整を加えて現地時間の分に直す*/
/* ただし、1周分の周回はまだ考慮していない */
local_minutes = minutes + (int)(60.0 * decimal);
if( local_minutes >= 60 ) counter++; /* 60分を上回ってた場合は時を+1 */
if( local_minutes < 0 ) counter--; /* 0分を下回ってた場合は時を-1 */
if( local_minutes < 0 ) local_minutes = 60 + local_minutes; /* 現地時間の分がマイナスの場合は60分から引いて調整 */
/* 現地時間の時の計算 */
/* 日本の時から現地時間の時を求める(hour+integer) */
/* 分の差による周回を超えた場合、遡った場合を考慮して必要に応じて時を+-1する */
local_hour = hour + integer + counter;
/* 現地時間がマイナスになってしまった場合 */
if( local_hour < 0 ) local_hour += 24; /* 24時間を足して調整 */
local_hour %= 24; /* 時は23時までなので超えた場合の調整 */
local_minutes %= 60; /* 分は59分までなので超えた場合の調整 */
printf("%02d:%02d\n",local_hour,local_minutes); /* 現地時間の出力 */
return 0;
}
snow4726