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

C言語で婚約数を判定する方法をわかりやすく解説

婚約数(Betrothed Numbers)とは?

婚約数(betrothed numbers)とは、2つの整数のペアのうち、一方の数の約数の総和(その数自身を除く)に1を加えると、もう一方の数と等しくなるような関係を持つ数のペアのことです。

具体的には、(a, b) が婚約数のペアであるためには、s(a) = b + 1 かつ s(b) = a + 1 が成り立つ必要があります。ここで s(n) は、n 自身を除く約数の総和(アリコット和)を表します。この条件は、約数関数 σ を使って「σ(a) = σ(b) = a + b + 1」という形でも表現できます。

婚約数として知られている最初のいくつかのペアは以下の通りです。

(48, 75)、(140, 195)、(1050, 1925)、(1575, 1648)、(2024, 2295)、(5775, 6128)

興味深いことに、現在知られているすべての婚約数のペアは偶奇性が異なっています(片方は偶数、もう片方は奇数)。もし同じ偶奇性を持つペアが存在するならば、それは 1010 を超える非常に大きな数になると考えられています。

判定アルゴリズム

ステップ1:両方の数について、約数の総和を求める。
ステップ2:一方の数の約数の和に1を加えた値が、もう一方の数と一致するかどうかを確認する。
ステップ3:一致すれば婚約数、そうでなければ婚約数ではない。

実行例

入力: a = 48, b = 75
出力:
48 と 75 は婚約数です

処理の流れの解説

まず、48 の約数を列挙すると「1, 2, 3, 4, 6, 8, 12, 16, 24」となり、その総和は 76 になります。

次に、75 の約数を列挙すると「1, 3, 5, 15, 25」となり、その総和は 49 になります。

C言語では for ループを使い、1 から a - 1 までの各数値を順番に調べます。ループ内で、その数値が a を割り切れるかどうかを判定し、割り切れる場合は変数 aDivisorSum に加算していきます。ループが完了した時点で、aDivisorSum には a のすべての約数の和が格納されています。

同じ手順で、もう一方の数の約数の総和も求めて bDivisorSum に保存します。

最後に、「一方の数に1を加えた値が、もう一方の数の約数の和と一致するか」を確認します。条件を満たしていれば両者は婚約数であると出力し、満たしていなければ婚約数ではないと出力します。

C言語による実装例

#include <stdio.h>
int main() {
    int i;
    int a,b;
    int aDivisorSum = 0;
    int bDivisorSum = 0;
    a=48 ;
    b=75 ;
    for( i = 1; i < a; i++) {
        if(a % i == 0) {
            aDivisorSum = aDivisorSum + i;
        }
    }
    for( i = 1; i < b; i++) {
        if(b % i == 0) {
            bDivisorSum = bDivisorSum + i;
        }
    }
    if(( a+1== bDivisorSum) && (b+1 == aDivisorSum)) {
        printf("%d and %d are Betrothed numbers\n",a,b);
    } else {
        printf("%d and %d are not Betrothed numbers\n",a,b);
    }
}

実行結果

48 and 75 are Betrothed numbers

このように、48 の約数の和(76)は 75 + 1 と一致し、75 の約数の和(49)は 48 + 1 と一致するため、(48, 75) は婚約数のペアであることが確認できます。

  1. C言語で自然数を列方向に出力するプログラムの作り方

    プログラムの概要 本記事では、C言語を使って自然数を列方向(縦方向)に並べたパターンを出力する方法を解説します。完成イメージは以下のとおりです。 1 2 6 3 7 10 4 8 11 13 5 9 12 14 15 一見複雑に見えるこの数列も、行と列の関係さえ理解できれば、シンプルなループ処理だけで実現できます。 アルゴリズムの考え方 変数 i は行番号、j は列番号を表し、ここでは5行分のパターンを作成します。 外側のループで各行(i = 1〜5)を順に処理する 内側のループに入る前に、k を i の値で初期化する 内側のループで各列(j = 1〜i)を処理する 現在の k の値を表示

  2. C言語で非平方数(完全平方数以外の数)を出力する方法

    プログラムの概要ある数の「平方」とは、その数にその数自身を掛け合わせた値のことです。「平方数」または「完全平方数」とは、ある整数を二乗することで得られる整数を指します。完全平方数は自然数を二乗した数であり、具体的には以下のような数になります。1, 4, 9, 16, 25, 36, 49, 64, 81, 100以下は、1から100までの各完全平方数とその平方根の一覧です。√1 = 1 (12 = 1 であるため) √4 = 2 (22 = 4 であるため) √9 = 3 (32 = 9 であるため) √16 = 4 (42 = 16 であるため) √25 = 5 (52 = 25 であるため