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

C++で配列の隠し数(ヒドゥンナンバー)を求めるプログラムの作成方法


この問題では、n個の整数値で構成される配列 arr[] が与えられます。求めるのは、C++で配列の隠し数(ヒドゥンナンバー)を見つけるプログラムです。

問題の説明

隠し数とは、配列の各要素からその数を引いたとき、差の合計がちょうど0になるような数のことを指します。

具体例で問題を確認しましょう。

入力

arr[] = {4, 1, 6, 7, 2}

出力

4

説明: 配列のすべての要素から4を引き、その値を合計すると以下のようになります。

= (1 - 4) + (6 - 4) + (7 - 4) + (2 - 4)
= -3 + 2 + 3 - 2 = 0

このように合計が0になるため、4がこの配列の隠し数であることがわかります。

解法のアプローチ

この問題を解くための手順は次のとおりです。

  1. 配列の全要素の合計値を計算する。
  2. 合計値を配列の要素数で割る。
  3. 割り算の結果が整数(余りなし)であれば、その値が隠し数となる。
  4. 割り切れない場合は、隠し数は存在しない(-1を返すなど)。

数学的に考えると、隠し数を x とすると Σ(arr[i] − x) = 0 が成り立ちます。これを変形すると x = Σarr[i] ÷ n となり、隠し数は配列の平均値に等しいことがわかります。つまり、平均値が整数になるときだけ隠し数が存在するのです。

サンプルプログラム

上記の解法を実装したプログラムがこちらです。

#include <iostream>
using namespace std;

int calcHiddenNumber(int arr[], int n){
    long int sum = 0;
    for(int i = 0; i < n; i++){
        sum = sum + arr[i];
    }
    int hidNum = (sum / n);
    if((hidNum * n) == sum)
        return hidNum;
    else
        return -1;
}

int main() {
    int n = 4;
    int arr[] = { 4, 11, 12, 21 };
    cout<<"配列の隠し数は "<<calcHiddenNumber(arr, n);
    return 0;
}

実行結果

配列の隠し数は 12

コードの解説:

  • calcHiddenNumber 関数では、まずforループを使って配列の全要素の合計を計算しています。
  • 合計を要素数 n で割り、その商を hidNum として保存します。
  • hidNum × n が元の合計と一致すれば割り切れたことになるため、hidNum を返します。
  • 一致しない場合は隠し数が存在しないので、-1 を返します。

この例では、4 + 11 + 12 + 21 = 48 となり、48 ÷ 4 = 12 で割り切れるため、12 が隠し数として出力されます。

計算量

時間計算量:O(n)(配列を一度だけ走査するため)
空間計算量:O(1)(追加のメモリは不要)

  1. グリッド内で照らされているセルの数を求めるC++プログラム

    問題の概要 ここでは、縦 h × 横 w のサイズを持つグリッドが与えられたとき、光で照らされているセルの数を求めるC++プログラムを紹介します。グリッドのセルには「電球」または「障害物」が置かれています。電球のあるセルは、そのセル自身と上下左右のセルを照らし、光は障害物に遮られない限りまっすぐ伝わっていきます。一方、障害物のあるセルは照らされることがなく、電球の光を遮って他のセルへ光が届かないようにします。電球の位置を配列 bulb、障害物の位置を配列 obstacles として受け取り、グリッド全体で照らされているセルの合計数を求めます。 たとえば、入力が h = 4、w = 4、bulb

  2. C++で二分木の最も深い葉ノードの値の合計を求める方法

    はじめに二分木(バイナリツリー)が与えられたとき、その中で最も深い位置にある葉ノード(deepest leaves)の値の合計を求めることを考えます。例えば、次のような二分木があるとします。この場合、最も深い葉ノードは 7 と 4 であり、出力は 11 になります。解法のアプローチこの問題は、深さ優先探索(DFS)を用いて各レベルごとのノードの値の合計を記録し、最後に最大深度に対応する合計を取得することで解けます。具体的には、以下の手順に従います。レベルごとの合計を保持するマップ m と、最大深度を記録する変数 maxDepth を定義するノードとレベルを受け取る再帰メソッド solve()