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

合計が完全平方数になるn個の数を出力する方法【C言語】

問題概要

本記事では、指定された個数(n)の整数を出力し、それらの合計が完全平方数(ある整数の2乗として表せる数)となるようにするプログラムを紹介します。

ここで重要なのが、次の数学的性質です。

「最初から数えてn個の奇数を足すと、必ず n²(nの2乗)になる」

この性質を利用すれば、複雑な計算を行わなくても簡単に目的の数列を求めることができます。

入力例 : 5
出力例 : 1 3 5 7 9
検算  : 1 + 3 + 5 + 7 + 9 = 25 = 5²(完全平方数)

アルゴリズム

処理の流れは以下の通りです。

  1. サイズ(SIZE)を5、カウンタ変数 i を1として宣言・初期化します。
  2. i が SIZE 以下である間、ループを繰り返します。
    • (2 × i) − 1 の値(i番目の奇数)を出力します。
  3. i を1ずつ増加させます。
  4. ループが終了したら処理を完了します。

式 (2 × i) − 1 は、i番目の奇数を求める一般的な公式です。i = 1, 2, 3, … と代入していくと、1, 3, 5, 7, 9 という奇数列が得られます。

C言語による実装例

#include <stdio.h>
# define SIZE 5

int main() {
    int i = 1;
    while (i <= SIZE) {
        printf("\n %d", ((2 * i) - 1));
        i++;
    }
    return 0;
}

実行結果

上記のプログラムを実行すると、次の出力が得られます。

1
3
5
7
9

なぜ奇数の合計が平方数になるのか?

この性質を具体的に確認してみましょう。

  • 1 = 1²
  • 1 + 3 = 4 = 2²
  • 1 + 3 + 5 = 9 = 3²
  • 1 + 3 + 5 + 7 = 16 = 4²

これは、連続する2つの平方数の差が常に奇数になっているためです。

(k + 1)² − k² = 2k + 1

つまり、k番目までの合計に次の奇数 (2k + 1) を加えると、(k + 1)² にちょうど一致します。この規則性こそが、「n個の奇数の合計は必ず完全平方数になる」理由です。

まとめ

合計が完全平方数になるn個の数を出力するには、最初のn個の奇数を順に出力するだけで実現できます。時間計算量は O(n)、追加のメモリも不要であり、非常に効率的なアプローチと言えます。

  1. C++プログラムで指定サイズの最大合計を持つ正方形部分行列を出力する方法

    N×N の行列が与えられたとき、M ≤ N かつ M ≥ 1 を満たすサイズ M×M の部分行列の中から、すべての要素の合計が最大となるものを見つけます。入力される行列には、0・正の整数・負の整数のいずれも含まれる可能性があります。 例 入力:     {{1, 1, 1, 1, 1},     {2, 2, 2, 2, 2},     {3, 3, 3, 3, 3},     {4, 4, 4, 4, 4},  &nbs

  2. Cプログラムで2次元行列の四隅の要素とその合計を出力する方法

    概要 サイズ2×2以上の2次元配列(行列)が与えられたとき、その四隅に格納されているすべての要素を取り出し、合計を求めて出力するのが本記事のテーマです。 四隅の要素とは? 行数「r」、列数「c」(いずれも0から開始)をもつ行列 mat[r][c] を考えると、四隅の要素は次の4つになります。 左上:mat[0][0] 右上:mat[0][c-1] 左下:mat[r-1][0] 右下:mat[r-1][c-1] したがって、求める合計は次の式で表されます。mat[0][0] + mat[0][c-1] + mat[r-1][0] + mat[r-1][c-1]これらの四隅の要素を取得して加算