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

【C++】差がnとなる2つの合成数を見つける方法

整数 n が与えられたとき、その差がちょうど n になる2つの合成数(素数ではない数)ab を求める問題を考えます。

例えば、入力が n = 512 の場合、出力は 51204608 となります。実際に確認すると、5120 − 4608 = 512 であり、両方とも合成数なので条件を満たしています。

解法のアプローチ

この問題は一見すると探索が必要そうに思えますが、実は非常にシンプルな数学的性質を利用すれば、即座に答えを導き出せます。

答えは、10 × n9 × n を出力するだけです。

なぜこの方法が有効なのか?

  • 10 × n は必ず 10 を約数に持つため、常に合成数になります。
  • 9 × n は必ず 9 を約数に持つため、常に合成数になります。
  • 両者の差は (10 × n) − (9 × n) = n となり、問題の条件を満たします。

このように、任意の正の整数 n に対して、この方法は必ず正しい答えを返します。

C++での実装例

それでは、実際のコードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;

void solve(int n) {
    cout << 10 * n << ", " << 9 * n;
}

int main() {
    int n = 512;
    solve(n);
    return 0;
}

入力

512

出力

5120, 4608

まとめ

この問題は、「ある数の倍数は必ず合成数になる」という合成数の基本的な性質を利用することで、計算量 O(1) で解くことができます。複雑な探索アルゴリズムや素数判定は一切不要で、単純な掛け算だけで答えが得られる点がこの解法の魅力です。競技プログラミングにおいても、このような数学的なひらめきが求められる典型例と言えるでしょう。

  1. C++で指定された長さの連続する合成数の範囲を求める方法

    正整数 n が与えられたとき、「範囲内のすべての数が合成数であり、かつ範囲の長さがちょうど n となる」ような正整数の範囲を求める問題を考えます。条件を満たす範囲が複数存在する場合は、そのうちのどれか1つを出力すれば構いません。なお、合成数(composite number)とは「1 とその数自身以外に、少なくとも1つの約数を持つ数」のことです。アルゴリズムの考え方範囲の長さが n である以上、先頭の数を a とすると、範囲内の残りの数は a + 1, a + 2, …, a + n − 1 となり、これらがすべて合成数でなければなりません。ここで役立つのが階乗(factorial)の性質です

  2. 【C++】合計と最大公約数(GCD)が与えられた2つの数を求める方法

    この記事では、2つの数 a と b の合計(sum)と最大公約数(GCD)が与えられたときに、元の2つの数を復元する方法を解説します。条件を満たす組み合わせが存在しない場合は -1 を返します。 例えば、合計が 6、GCDが 2 とすると、答えは 4 と 2 になります(4 + 2 = 6、gcd(4, 2) = 2 を満たすため)。 考え方(アプローチ) GCDが分かっているということは、2つの数がどちらもGCDの倍数であることが確定します。この性質を利用すると、次の手順で答えを導き出せます。 候補の生成: 片方の数をGCDそのものと仮定すると、もう片方は「合計 − GCD」となります。