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

C++でLEDの点灯変化をカウントし、数字を1つずつ表示する方法

正の整数 num が与えられ、LEDライトを1つずつ点灯させて数字を表示する際の「変化回数」を求めるのが本記事の課題です。ここでは、初期状態ではすべてのLEDが消灯しており、文字列の値に基づいて順番に点灯していくものと仮定します。

この問題を解くには、まず「7セグメントディスプレイ」の構造と動作原理を理解する必要があります。

7セグメントディスプレイとは

7セグメントディスプレイは、画像・テキスト・10進数の数字などを表示できる出力表示装置で、より複雑なドットマトリクスディスプレイに代わる表示手段として広く活用されています。デジタル時計や簡易電卓、電子メーターなど、数値情報を表示するさまざまな電子機器に採用されています。その名の通り、7つの発光ダイオード(LED)セグメントで構成されており、これらが数字の「8」の形に組み合わされています。

C++でLEDの点灯変化をカウントし、数字を1つずつ表示する方法

7セグメントディスプレイの仕組み

すべてのセグメントに通電すると「8」が表示され、「g」のセグメントへの通電を止めると「0」が表示されます。7セグメントディスプレイでは、複数のピンに同時に電圧を印加できるため、0〜9までの各数字を組み合わせて表示することが可能です。なお、XやZのような一部のアルファベットは表現できないため、文字表示には適しておらず、主に10進数の数値表示に使用されます。ただし、A・B・C・D・E・F の6文字は表示できるため、16進数の桁を表す用途にも利用できます。

C++でLEDの点灯変化をカウントし、数字を1つずつ表示する方法

具体例

入力: num = "123"
出力: 変化回数は 5

解説: 最初の「1」を点灯させるには2個のLEDが必要です。続いて「2」へ切り替える際は点灯セグメント数の差(|5 − 2| = 3)だけ変化が起こり、「3」では差が0になります。よって合計の変化回数は 2 + 3 + 0 = 5 回となります。

入力: num = "576"
出力: 変化回数は 10

解説: 「5」を点灯させるには5個のLEDが必要です。「7」へ切り替える際に |3 − 5| = 2 回、「6」へ切り替える際に |6 − 3| = 3 回の変化が生じます。合計は 5 + 2 + 3 = 10 回となります。

プログラムのアプローチ

  • 点灯させたい数字を表す数値文字列を入力として受け取る

  • length() 関数を使って文字列の長さ(桁数)を整数値として取得する

  • 各数字に必要なLEDの数を格納した配列を作成する

  • 計算結果を保持する一時変数 temp を用意する

  • i = 1 から i が文字列の長さ未満である間、ループを繰り返す

  • ループ内で temp = temp + abs(LED[str[i] - '0'] - LED[str[i-1] - '0']) を計算する

  • 最終的なカウントを返す

  • 結果を出力する

コード例

#include<iostream>
using namespace std;
int countled(string str){
    // 各数字を表示するのに必要なLEDの数
    int Led[] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 5 };
    int len = str.length();
    // 変化回数の計算
    int res = Led[str[0] - '0'];
    for (int i = 1; i < len; i++){
        res = res + abs(Led[str[i] - '0'] - Led[str[i - 1] - '0']);
    }
    return res;
}
int main(){
    string str = "123";
    cout << "count is " << countled(str);
    return 0;
}

出力

上記のコードを実行すると、次の出力が得られます。

count is 5
  1. C++で一意の桁(重複しない数字)を持つ数を数える方法

    負でない整数 n が与えられたとき、0 以上 10n 未満の範囲に存在する「すべての桁が一意(重複なし)」である数 x の個数を求める問題を考えてみましょう。例えば n = 2 の場合、0 から 100 未満までの数のうち、11、22、33、44、55、66、77、88、99 のように同じ数字が重複している数を除外した個数、つまり 91 が答えとなります。解法のアプローチこの問題は、桁ごとに選べる数字の組み合わせを順番にかけていくことで効率的に解くことができます。手順は以下の通りです。n が 0 の場合は 1 を返します(0 のみが該当するため)。n は最大でも 10 桁しか考慮できないため、

  2. C++で配列として表現された数値に1を加算する方法

    配列で表現された数値とは 数値を配列として表現する場合、数値の各桁を配列の個々の要素に格納します。配列の長さは数値の桁数と一致し、たとえば4桁の数値であれば配列の長さも4となります。各要素には一桁の数字(0〜9)だけが格納され、配列の末尾の要素には数値の最下位桁が、先頭の要素には最上位桁が保存されます。 例えば、数値351932は {3,5,1,9,3,2} という形で表現されます。 1を加算する仕組み このような数値に1を加算するには、まず配列の最後の要素に1を足し、繰り上がり(キャリー)が発生するかどうかを確認します。最後の桁が9だった場合には繰り上がりが発生し、その要素の値は0になりま