C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でデジタル時計(HH:MM)の全桁が同じ数字になる回数を数える方法

HH:MM 形式で時刻を表示するデジタル時計を考えてみましょう。この時計は「時」と「分」のみを表示します。ここに、経過時間を「時間」と「分」として入力として与え、表示されるすべての桁が同じ数字になる瞬間(00:00 や 11:11 のような時刻)が何回現れるかを数えるのが本記事の目的です。

同じ数字が並ぶ時刻とは

24時間表記において、全桁が同じ数字になるのは 00:00(真夜中)、11:11、22:22 の3回です。本問題では入力される時間数が 24 を超えてもよいことになっているため、桁のパターンは 11 時間ごとに繰り返し現れるものとして数えます。

入出力例

例1

入力: 12時間 22分
出力: 2

解説: 12時間の間に該当するのは 00:00 と 11:11 の2回です。

例2

入力: 48時間 22分
出力: 5

解説: 00:00 を起点として、11:11、22:22、33:33、44:44 と 11 時間ごとに同じ数字が並ぶパターンが現れるため、合計5回となります。

プログラムのアプローチ

  • 変数 hours と minutes に入力値を格納します。
  • 関数 countIdentical(int hours, int minutes) が、全桁が同じ数字になる回数を返します。
  • 00:00 をあらかじめ数えておくため、count は 1 で初期化します。
  • 時刻を 11 ずつ増やしながら(11、22、33、44 …)、その下一桁が入力の minutes 未満であれば count をインクリメントします。
  • ループが終了したら結果を返します。
  • 最後にカウントを出力します。

C++での実装例

// アプローチのC++実装
#include <bits/stdc++.h>
using namespace std;
// 例: 11:11(11時間11分)、22:22 など
int countIdentical(int hours, int minutes){
    // 00:00 を含めるため 1 で初期化
    int i, count = 1;
    // 2桁の時刻を 11 ずつ進めて確認
    for (i = 11; i <= 99 && i < hours; i = i + 11) {
        // 分の部分も同じ数字の範囲内かチェック
        if ((i % 10) < minutes)
            count++;
    }
    return count;
}
int main(){
    int hours = 48;
    int minutes = 22;
    cout << "HH:MM の全桁が同じ数字になる回数 : "
         << countIdentical(hours, minutes);
    return 0;
}

出力

HH:MM の全桁が同じ数字になる回数 : 5

コードのポイント

  • count を 1 で初期化することで、00:00 を最初にカウントしています。
  • ループ変数 i は 11 から開始して 11 ずつ増やすことで、下一桁と十の位がそろった時刻(11:11、22:22 など)だけを効率よく確認できます。
  • 条件式 (i % 10) < minutes により、その時刻の「分」の部分が入力された minutes の範囲内に収まっているかを判定しています。
  • 計算量は O(H / 11) と非常に効率的で、大きな入力に対しても高速に動作します。
  1. C++とOpenCVで動画の総フレーム数をカウント・取得する方法

    はじめにこの記事では、OpenCVを使って動画の総フレーム数を求める方法を解説します。OpenCVを利用すれば、動画の総フレーム数を数えて表示するのは非常に簡単です。ただし、一点だけ注意が必要です。リアルタイム映像(Webカメラの映像など)のフレーム数は数えることができません。リアルタイム映像には決まったフレーム数が存在しないためです。以下のプログラムでは、動画ファイルの総フレーム数をカウントし、コンソール画面に表示します。サンプルコード#include<opencv2/opencv.hpp> #include<iostream> using namespace std

  2. C++でグリッド内の指定方向に実行可能な移動回数をカウントする方法

    サイズ n × m のグリッドと、開始座標 (x, y) を表す変数が与えられます。さらに、グリッド内を移動するために使用できるステップのペア(例:(1,1)、(2,2) など)も与えられます。各ペアは、x 軸と y 軸方向に進む単位移動量を表します。ゴールは、境界 [1, n] × [1, m] の範囲内でグリッド内を移動できる合計ステップ数を求めることです。 たとえば、n = 5、m = 4、現在位置が (2, 2)、選択したステップが (1, -1) の場合を考えてみましょう。このステップを 1 回適用すると (3, 1) に移動できますが、もう 1 回適用すると (4, -1) となり