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

C++で隣接要素が互いに割り切れない昇順配列を生成する方法

整数 n が与えられたとします。ここで、n 個の要素からなる配列 A を作成することを考えます。配列 A は次の条件を満たす必要があります。

  • A は昇順にソートされている
  • すべての要素は互いに異なる(重複がない)
  • インデックスを 1 から始めた場合、2 ≤ i ≤ n を満たすすべての i について、A[i] が A[i-1] で割り切れない

例えば、入力が n = 7 の場合、出力は [2, 3, 4, 5, 6, 7, 8] となります。

解法のアプローチ

この問題は実は非常にシンプルです。2 から n+1 までの連続する整数をそのまま並べるだけで条件を満たす配列が得られます。連続する整数において、大きい方の数を小さい方の数で割ると必ず余りが発生するため、隣接要素どうしが割り切れることはありません。したがって、この方法で常に正解となります。

アルゴリズムの手順

  1. 変数 i を 2 で初期化します。
  2. i が n + 1 以下である間、i を出力し、i を 1 ずつ増やしていきます。

C++による実装例

理解を深めるために、以下の実装例を見てみましょう。

#include <bits/stdc++.h>
using namespace std;
void solve(int n){
    for (int i = 2; i <= n + 1; i++){
        printf("%d, ", i);
    }
}
int main(){
    int n = 7;
    solve(n);
}

入力

7

出力

2, 3, 4, 5, 6, 7, 8

計算量について

このアルゴリズムは配列を一度だけ走査して出力するため、時間計算量は O(n)、追加のメモリ使用量は O(1) となり、非常に効率的です。

  1. C++で整数配列から最大の積を持つペアを見つける方法

    配列Aにn個の異なる要素が含まれているとします。この配列Aから、積が最大になるペア(x, y)を見つける必要があります。配列には正の要素だけでなく、負の要素も含まれている可能性がある点に注意しましょう。例えば、配列が A = [-1, -4, -3, 0, 2, -5] の場合、(-4, -5) のペアが最大の積(20)を持つため、これが答えとなります。負の数同士を掛け合わせると正の数になるため、このようなケースが生じます。解決のアプローチこの問題を解くには、配列を一度走査しながら以下の4つの値を追跡します。positive_max:正の要素の最大値positive_second_max:正の

  2. C++で重複要素を含むソート済み配列から不動点を効率的に検索する方法

    本記事では、与えられた配列の中から「不動点(Fixed Point)」を見つける方法を解説します。不動点とは、配列の要素の値がそのインデックスと一致している箇所のことです。例えば、arr[2] = 2 のような場合、インデックス2が不動点となります。このプログラムは、不動点が存在すればその値を返し、存在しない場合は -1 を返します。なお、配列には負の数も含めることができ、要素は昇順にソートされているものとします。さらに、この問題では重複した要素が存在することを許容している点がポイントです。アルゴリズムの考え方:修正版二分探索この問題は、二分探索を使えば O(log n) の時間計算量で解くこ