C++で2つの数の倍数を統合・ソートしたリストからN番目の値を求める方法
3つの整数 x、y、n が与えられたとき、x の倍数と y の倍数をすべて統合して昇順に並べたリストを作り、その中から n 番目の値を求める問題です。まずは具体例で確認してみましょう。
入力例
x = 2 y = 3 n = 7
出力例
10
考え方
2 の倍数(最初の7個)は「2, 4, 6, 8, 10, 12, 14」、3 の倍数(最初の7個)は「3, 6, 9, 12, 15, 18, 21」です。
これらを統合し、重複を除いて昇順にソートすると「2, 3, 4, 6, 8, 9, 10, 12, 14, 15, 18, 21」となります。このリストの7番目の値は 10 です。
アルゴリズム
- 倍数を格納するための vector を用意する。
- x の最初の n 個の倍数を求め、vector に追加する。
- y の最初の n 個の倍数を順に調べる。
- すでに vector に存在しない場合のみ追加する(重複を避けるため)。
- vector を昇順にソートする。
- n 番目の要素を返す。
C++での実装
上記のアルゴリズムをC++で実装したものが以下のコードです。
#include<bits/stdc++.h>
using namespace std;
int findNthMultiple(int x, int y, int n) {
vector<int> multiples;
// x の最初の n 個の倍数を追加
for (int i = 1; i <= n; i++) {
multiples.push_back(x * i);
}
sort(multiples.begin(), multiples.end());
// y の倍数を重複なく追加
for (int i = 1; i <= n; i++) {
if (!binary_search(multiples.begin(), multiples.end(), y * i)) {
multiples.push_back(y * i);
sort(multiples.begin(), multiples.end());
}
}
return multiples[n - 1];
}
int main() {
int x = 2, y = 3, n = 7;
cout << findNthMultiple(x, y, n) << endl;
return 0;
}
実行結果
このコードを実行すると、次の出力が得られます。
10
計算量のポイント
この実装では、y の倍数を追加するたびにソートを行っているため、最悪の場合 O(n² log n) の計算量になります。より効率化したい場合は、両者の倍数をすべて集めてから最後に一度だけソートする方法や、std::merge や std::set を活用する方法が有効です。
-
C++で2つの数値を加算するプログラムの書き方【サンプルコード付き】
加算(足し算)は、最も基本的な算術演算の一つです。2つの数値を加算するプログラムは、指定された2つの数値の合計を計算し、その結果を画面に表示します。この記事では、C++で2つの数値を加算する方法を、変数を使った基本例と配列を使った応用例の2パターンに分けて解説します。例1:変数を使って2つの数値を加算するまずは、最もシンプルな方法です。2つの整数型変数を用意し、その合計を別の変数に格納して出力します。#include <iostream> using namespace std; int main() { int num1 = 15, num2 = 10, sum;
-
C#で2つのソート済み配列をマージする方法
C#で2つのソート済み配列を1つにまとめる(マージする)には、List<int>を経由するのがシンプルで分かりやすい方法です。ここでは、2つの配列の要素を交互に追加して新しい配列を作成する手順を解説します。 手順1:2つのソート済み配列を用意する まずは、マージ対象となる2つのソート済み配列を定義します。 int[] array1 = { 1, 2 }; int[] array2 = { 3, 4 }; 手順2:リストに要素を追加してマージする 次に、空のリストを作成し、forループを使って2つの配列の要素を交互に追加していきます。これにより、両方の配列が1つのリストに結合されます