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

【C#】配列内の2つの整数の合計が指定した整数と一致するか判定するプログラム

はじめに

この記事では、C#を使用して「配列内の任意の2つの整数を足し合わせた結果が、指定された整数と一致するかどうか」を判定するプログラムを紹介します。初心者にもわかりやすいよう、基本的な二重ループによる実装方法から、パフォーマンスを改善した手法まで順番に解説していきます。

対象となる配列の準備

まず、判定に使用する整数型の配列を定義します。

int[] arr = new int[] {
    7,
    4,
    6,
    2
};

次に、2つの整数の合計と比較する対象となる整数を設定します。

int res = 8;

判定ロジックの実装

配列内のすべての要素の組み合わせを調べるために、二重ループを使用します。外側のループで1つ目の要素を、内側のループで2つ目の要素を選択し、それぞれの合計が指定した整数と一致するかどうかを確認します。

なお、同じ要素同士(i == j)の組み合わせは除外したいので、if文でインデックスが異なる場合のみ計算を行うようにしています。

for (int i = 0; i < arr.Length; i++) {
    for (int j = 0; j < arr.Length; j++) {
        if (i != j) {
            int sum = arr[i] + arr[j];
            if (sum == res) {
                Console.WriteLine(arr[i]);
            }
        }
    }
}

完全なサンプルコード

ここまでの内容をまとめた、実行可能な完全なサンプルコードは以下の通りです。

using System;
using System.Collections.Generic;

namespace Demo {
    public class Program {
        public static void Main(string[] args) {
            int[] arr = new int[] {
                7,
                4,
                6,
                2
            };
            // 指定された整数
            int res = 8;
            Console.WriteLine("指定された整数 {0}:", res);
            Console.WriteLine("合計が一致する要素:");
            for (int i = 0; i < arr.Length; i++) {
                for (int j = 0; j < arr.Length; j++) {
                    if (i != j) {
                        int sum = arr[i] + arr[j];
                        if (sum == res) {
                            Console.WriteLine(arr[i]);
                        }
                    }
                }
            }
        }
    }
}

実行結果

指定された整数 8:
合計が一致する要素:
6
2

この例では「6 + 2 = 8」という組み合わせが見つかり、条件を満たす要素である「6」と「2」が出力されます。

計算量の課題と改善案

上記の二重ループによる手法はシンプルで理解しやすい反面、時間計算量がO(n²)になるという課題があります。配列の要素数が大きくなると処理時間が急激に増加します。

そこで、HashSetを活用することで、時間計算量をO(n)まで改善できます。「合計がresになるためには、もう片方の値は res - 現在の値 でなければならない」という考え方を利用した実装例が以下です。

HashSetを使った効率的な実装例

using System;
using System.Collections.Generic;

namespace Demo {
    public class Program {
        public static void Main(string[] args) {
            int[] arr = new int[] { 7, 4, 6, 2 };
            int res = 8;
            HashSet<int> seen = new HashSet<int>();

            foreach (int num in arr) {
                int complement = res - num;
                if (seen.Contains(complement)) {
                    Console.WriteLine($"{complement} + {num} = {res}");
                }
                seen.Add(num);
            }
        }
    }
}

この方法では各要素を一度だけ走査すればよいため、大規模なデータセットでも高速に動作します。用途やデータサイズに応じて、適切な手法を選択するとよいでしょう。

  1. Pythonで2つの整数の合計を求める方法|+と-を使わないビット演算テクニック

    問題概要 2つの整数 a と b が与えられたとき、その合計を求めることを考えます。ただし、+ や - のような算術演算子は使用できません。例えば、a = 5、b = 7 の場合、答えは 12 になります。 解決のアプローチ:ビット演算を活用する この問題は、ビット単位の論理演算子を組み合わせることで解決できます。ポイントは次の3つです。 XOR(^:排他的論理和) … 桁上がりを考慮しない「部分和」を計算します。 AND(&:論理積) … 桁上がりが発生する位置を検出します。 左シフト(<< 1) … 検出した桁上がりを1つ上の位へ移動させます。 アルゴリズムの手

  2. Pythonで整数配列の重複を除去し、個別の要素だけを出力する方法

    整数型の配列が与えられ、その中には重複した要素が含まれている場合があります。この記事では、重複を取り除いて個別(ユニーク)な値だけを出力するPythonプログラムを解説します。 実行例 入力:A = [1, 2, 3, 4, 2, 3, 5, 6] 出力:[1, 2, 3, 4, 5, 6] アルゴリズム このプログラムは次の手順で動作します。 配列の要素を入力として受け取ります。 各要素を先頭から順番に1つずつ取り出します。 取り出した要素が、それ以前にすでに出力されたものかどうかを確認します。 初期値0のフラグ変数を用意し、すでに表示済みなら1、未表示なら0のままにします。 フラ