C++でN個のセグメントを使って7セグメントディスプレイに表示できる最大の数を求める方法
問題の概要
この記事では、7セグメントディスプレイに対してN個のセグメントを使用したときに、表示できる最大の数を求める方法を解説します。
まず、具体例を使って何をすべきかを確認しましょう。
入力 − N=5
出力 − 71
説明 − この場合、最大の数は7セグメントディスプレイ上で次のように表示されます。

入力 − N=6
出力 − 111

アルゴリズムのアプローチ
この問題は、次の3つの場合に分けて考えることができます。
ケース1 −
Nが0または1の場合、どの数字も表示できません。ケース2 −
Nが奇数の場合です。奇数個のセグメントで表示できる数字は2、3、5、7、8であり、その中で最も少ないセグメント数(3セグメント)で表示できるのは「7」です。したがって、この場合の最上位桁は7になります。ケース3 −
Nが偶数の場合です。偶数個のセグメントで表示できる数字は0、1、4、6、9であり、その中で最も少ないセグメント数(2セグメント)で表示できるのは「1」です。したがって、この場合の最上位桁は1になります。
なぜこの方法が有効なのか
表示する数を最大化するには、桁数をできるだけ多く確保することが重要です。そのためには、1桁あたりのセグメント消費を最小限に抑える必要があります。偶数の場合は2セグメントで表示できる「1」を繰り返し使い、奇数の場合は先頭に3セグメントの「7」を置くことで、残りのセグメントをすべて有効活用できます。
実装の手順
MaxNumber()関数内で、まずif文を使って基本条件をチェックします。
if (N == 1 || N == 0)次に別のif文でNが偶数かどうかを判定します。偶数であれば、偶数ケースにおける最上位桁である「1」を出力し、2セグメントを消費するためMaxNumber(N - 2)を再帰的に呼び出します。
さらに別のif文でNが奇数かどうかを判定します。奇数であれば、奇数ケースにおける最上位桁である「7」を出力し、3セグメントを消費するためMaxNumber(N - 3)を再帰的に呼び出します。
コード例
#include <iostream>
using namespace std;
void MaxNumber(int N){
//基本ケースをチェックする条件
if (N == 1 || N == 0){
return;
}
//数が偶数の場合
if (N % 2 == 0){
cout << "1";
MaxNumber(N - 2);
}
//数が奇数の場合
else if (N % 2 == 1){
cout << "7";
MaxNumber(N - 3);
}
}
//メイン関数
int main(){
int N;
N = 5;
MaxNumber(N);
return 0;
}
出力
上記のコードを実行すると、次の出力が得られます。
71
-
C++でN×Nチェス盤に配置できるビショップの最大数を求める方法
問題概要チェス盤のサイズを表す整数 N が入力として与えられます。この問題では、任意の N に対して、N×N のチェス盤上に互いに攻撃し合わないようにビショップ(bishop)を最大何個配置できるかを求めます。まず、具体例を使って理解していきましょう。例1入力: N = 2出力: N×N チェス盤に配置できるビショップの最大数 ― 2説明: 2×2 のチェス盤の場合、互いに干渉しない位置は図示された場所のみです。つまり、2×2 の盤面に配置できるビショップは最大 2 個となります。例2入力: N = 5出力: N×N チェス盤に配置できるビショップの最大数 ― 8プログラムで使用するアプローチ
-
C++で直角二等辺三角形に収まる正方形の最大数を求める方法
この記事では、底辺の長さが「s」である直角二等辺三角形の中に、一辺「a」の正方形を最大でいくつ収めることができるかを求める問題を解説します。二等辺三角形とは、少なくとも2つの等しい辺を持つ三角形のことです。 まず、具体例を使って何をすべきかを理解しましょう。 入力例 s=5, a=1 出力 10 説明 − 底辺に並べられる正方形の数は、「s を a で割って 1 を引く」ことで求められます。つまり、底辺の正方形の数 = 5/1 − 1 = 4 個です。 同様に、最下段に4つの正方形を配置すると、その上に底辺が (s−a) の新しい二等辺三角形ができます。同じ手順を繰り返すと3個、さらにその上