時間・分・秒への変換


「入力された秒数を時間・分・秒に分けて表示する」プログラムは、非常によく出題されるプログラムの問題です。

単なる順次構造でありながら、剰余の概念がしっかり分かっていないと解けない問題になっています。

1.時間の変換と剰余


例えば、70秒は1分と10秒に分解することができます。この時、どのような計算を行っているでしょうか。

1分は60秒なので、70 ÷ 60 = 1 余り 10と計算し、商の部分を「分」に、余りの部分を「秒」にしているのです。

幸いなことに、多くの言語では整数型同士の演算が整数型になるというルールがあります。

これを利用して、秒を時間・分・秒に分けることができるのです。

 

下記は「入力された秒数(自然数)を時間・分・秒に分けて表示する」プログラムです。


秒変換(C)



#include <stdio.h>
int main(void){
    int sec, min, hour;
    printf("秒数を入力:");
    scanf("%d", &sec);
    
    hour = sec / 3600;
    min = (sec%3600) / 60;
    sec = sec % 60;

    printf("%d:%d:%d\n", hour,min,sec);
    return 0;
}

秒変換(Java)

import java.util.Scanner;
public class TimeConvert{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int sec, min, hour;
        System.out.print("秒数を入力:");
        sec = sc.nextInt();

        hour = sec / 3600;
        min = (sec%3600) / 60;
        sec = sec % 60;

        System.out.println(hour+":"+min+":"+sec);
    }
}


実行結果(例)

秒数:4000

1:6:40

 

プログラムを具体的に見ていきます。

まず、入力された秒数を3600で割り、その商を「時間」にします。小数点以下は勝手に切り捨てられるので心配いりません。

続いて、秒数を3600で割った余りを60で割り、その商を「分」にします。余りを割っているのは、時間に変換できる秒数を除いた秒数から分を求めるためです。全秒数を割ってしまうと、分が60分以上になってしまうことがあります。

最後に、秒数を60で割った余りを「秒」にします。ここは余りを使うので、全秒数を割って大丈夫です。

 

上記実行結果の4000秒を例に、さらに詳しく見ていきます。

まず、4000 ÷ 3600 = 1.111... より、小数点以下を切り捨てて、hour = 1 となります。

続いて、4000 ÷ 3600 = 1 余り400 より、余りの400を使います。400 ÷ 60 = 6.666... ですから、min = 6 となります。

最後に、4000 ÷ 60 = 66 余り40 なので、sec = 40 です。

以上から、4000秒は1時間6分40秒であることが分かりました。

これは、4000 = 3600 × 1 + 60 × 6 + 40 と分解しているのと同じことなのです。