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

C言語でプラス完全数(Armstrong数)を判定するプログラム

n桁の整数xが与えられたとき、その数が「プラス完全数(Plus Perfect Number)」であるかどうかを判定するのが本記事のテーマです。プラス完全数とは、各桁の数字dを桁数nでべき乗した値(dn)をすべて合計し、その合計が元の数と一致する場合を指します。この考え方は、いわゆる「Armstrong数(ナルシシスト数)」の判定とまったく同じものです。

具体例

入力:163
出力:完全数ではない
説明:1³ + 6³ + 3³ = 244 となり、163と一致しないため

入力:371
出力:完全数である
説明:3³ + 7³ + 1³ = 371 となり、元の数と一致するため

上記の例のように、各桁を桁数乗して合計した結果が元の数と等しければプラス完全数、等しくなければプラス完全数ではありません。

判定のアプローチ

  • ステップ1:入力された数の桁数を数える。
  • ステップ2:各桁の数字を、桁数と同じ回数だけべき乗する。
  • ステップ3:すべてのべき乗結果を合計し、元の数と一致するかどうかを確認する。

アルゴリズム

開始
関数 int power(int a, int b)
  ステップ1→ power を 1 として宣言・初期化
  ステップ2→ b > 0 の間ループ
    power = power * a を設定
    b を 1 減らす
  ステップ3→ power を返す
関数 power 終了

関数 int count(int n)
  ステップ1→ i を 0 として宣言・初期化
  ステップ2→ n != 0 の間ループ
    i を 1 増やす
    n = n / 10 を設定
  ループ終了
  ステップ3→ i を返す

関数 int perfect_number(int n)
  ステップ1→ x を count(n) として宣言・初期化
  ステップ2→ rem を 0、m を 0 として宣言・初期化
  ステップ3→ n が真の間ループ
    rem に n % 10 を設定
    m に m + power(rem, x) を設定
    n に n / 10 を設定
  ループ終了
  ステップ4→ m を返す
関数 perfect_number 終了

関数 int main(int argc, char const *argv[])
  ステップ1→ n を 1634 として初期化
  ステップ2→ n == perfect_number(n) ならば、
    "Number is a perfect_number" を表示
  ステップ3→ そうでなければ
    "Number is not a perfect_number" を表示
  if 終了
main 終了
終了

C言語による実装例

#include <stdio.h>
int power(int a, int b) {
    int power = 1;
    while(b > 0) {
        power *= a;
        b--;
    }
    return power;
}
int count(int n) {
    int i = 0;
    while(n != 0) {
        i++;
        n = n / 10;
    }
    return i;
}
int perfect_number(int n) {
    int x = count(n);
    int rem = 0, m = 0;
    while(n) {
        rem = n % 10;
        m += power(rem, x);
        n /= 10;
    }
    return m;
}
int main(int argc, char const *argv[]) {
    int n = 1634;
    if(n == perfect_number(n)) {
        printf("Number is a perfect_number\n");
    }
    else
    printf("Number is not a perfect_number\n");
    return 0;
}

実行結果

上記のコードを実行すると、次の出力が得られます。

Number is a perfect_number

この例では入力として1634を使用しています。1634は4桁の数であり、1⁴ + 6⁴ + 3⁴ + 4⁴ = 1 + 1296 + 81 + 256 = 1634 となるため、プラス完全数(Armstrong数)として正しく判定されます。なお、3桁のArmstrong数には153、370、371、407などがあり、これらも同様のロジックで判定できます。

  1. Pythonで素数を判定するプログラムの書き方を徹底解説

    はじめに この記事では、「与えられた数値が素数かどうかを判定する」という問題に対する解決策を、Pythonのコード例とともにわかりやすく解説します。 問題の概要 問題設定:ある数値が与えられたとき、その数が素数であるかどうかを判定するプログラムを作成します。 まず「素数」の定義をおさらいしましょう。1より大きい正の整数のうち、1とその数自身以外に約数を持たない数を素数(そすう)と呼びます。たとえば、2、3、5、7などはそれ以外の約数を持たないため、素数です。 プログラムの考え方 今回作成するプログラムでは、入力された数値が素数かどうかを以下の手順で判定します。 1以下の数値は素数ではない

  2. Pythonでアームストロング数を判定するプログラムの書き方

    この記事では、与えられた整数が「アームストロング数(Armstrong number)」であるかどうかを判定するための考え方と、Pythonによる具体的な実装方法を解説します。 問題の定義 整数 n が与えられたとき、その整数がアームストロング数であるかどうかを判定することを目標とします。 アームストロング数とは? n 桁の正の整数 abcd… が次の条件を満たすとき、この数は「n 次(オーダー n)のアームストロング数」と呼ばれます。 abcd... = a^n + b^n + c^n + d^n + … つまり、各桁の数字を「桁数乗」した値の総和が、元の数と一致するかを確認す