結果

問題 No.652 E869120 and TimeZone
ユーザー snow4726snow4726
提出日時 2018-03-13 20:31:47
言語 C
(gcc 12.3.0)
結果
WA  
実行時間 -
コード長 4,097 bytes
コンパイル時間 988 ms
コンパイル使用メモリ 30,336 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-05-02 21:19:40
合計ジャッジ時間 1,446 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 AC 1 ms
5,376 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 AC 1 ms
5,376 KB
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 AC 1 ms
5,376 KB
testcase_10 AC 1 ms
5,376 KB
testcase_11 AC 1 ms
5,376 KB
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 AC 1 ms
5,376 KB
testcase_19 WA -
testcase_20 AC 1 ms
5,376 KB
testcase_21 WA -
testcase_22 AC 1 ms
5,376 KB
testcase_23 AC 1 ms
5,376 KB
testcase_24 AC 1 ms
5,376 KB
testcase_25 AC 1 ms
5,376 KB
testcase_26 AC 1 ms
5,376 KB
testcase_27 AC 1 ms
5,376 KB
testcase_28 AC 1 ms
5,376 KB
testcase_29 AC 1 ms
5,376 KB
testcase_30 AC 1 ms
5,376 KB
testcase_31 AC 1 ms
5,376 KB
testcase_32 AC 1 ms
5,376 KB
testcase_33 AC 1 ms
5,376 KB
testcase_34 AC 1 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

/***********************************
日本の現在時刻から指定したタイムゾーンの
現地時間を求めるプログラム
入力:時 分 タイムゾーン
出力:現地時間
***********************************/
#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;    /* UTCの絶対値の整数部分 */
    double decimal; /* UTCの絶対値の小数部分 */
    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; /* UTCの絶対値の整数部分を取り出す */
    decimal = data - (double)((int)data); /* UTCの絶対値の小数部分を取り出す */

    /* 小数の誤差調整 */
    if( data > 0 ) data += 0.0001;
    if( data < 0 ) data -= 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する */

    if( hour + integer + counter < 0 ){   /* 現地時間がマイナスになってしまった場合 */
        local_hour = 24 - hour + integer + counter;   /* 24時間を引いて調整 */
    }else{
        local_hour = hour + integer + counter;  /* 現地時間がプラスであれば正常なのでその値が現地時間 */
    }

    local_hour %= 24;  /* 時は23時までなので超えた場合の調整 */
    local_minutes %= 60;  /* 分は59分までなので超えた場合の調整 */

    printf("%02d:%02d\n",local_hour,local_minutes); /* 現地時間の出力 */

    return 0;

}
0