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

C言語でアームストロング数を判定する方法


問題

C言語を使って、入力された数値がアームストロング数(Armstrong number)であるかどうかを判定するには、どのようにプログラムを書けばよいのでしょうか?

解決策

アームストロング数とは、各桁の数字を桁数乗した値の総和が、元の数値と等しくなる数のことです。3桁の数値であれば、「各桁の数字の3乗の合計」が元の数値に一致します。

構文

pqrs……=pow(p,n)+pow(q,n)+pow(r,n)+…….

例えば、153、371、1634などはアームストロング数として知られています。

153=1*1*1 + 5*5*5 + 3*3*3
  =1+125+27
  =153(アームストロング数)

プログラム

#include<stdio.h>
int main(){
    int number,remainder,total=0,temp;
    printf("enter the number=");
    scanf("%d",&number);
    temp=number;
    while(number>0){
        remainder=number%10;
        total=total+(remainder*remainder*remainder);
        number=number/10;
    }
    if(temp==total)
        printf("This number is Armstrong number");
    else
        printf("This number is not Armstrong number");
    return 0;
}

実行結果

enter the number=371
This number is Armstrong number
Check: 371=3*3*3 +7*7*7 + 1*1*1
          =27 + 343 +1
          =371 enter the number=53 This number is not Armstrong number

アルゴリズムのポイント

このプログラムでは、以下の手順でアームストロング数の判定を行っています。

  • remainder = number % 10:剰余演算子「%」を使って、数値の最下位の桁(1の位)を取り出します。
  • total += remainder の3乗:取り出した桁の3乗を合計値 total に加算していきます。
  • number = number / 10:整数除算によって桁を一つずらし、次の桁を処理できるようにします。
  • すべての桁を処理し終えた後、temp(元の数値)と total(3乗の和)を比較し、一致していればアームストロング数と判定します。

なお、元の数値はループ内で書き換えられてしまうため、あらかじめ変数 temp にコピーして保存しておく点が重要です。

解説

53がアームストロング数ではない理由を確認してみましょう。

53 = 5*5*5 + 3*3*3
  =125 +27
  = 152 != 53

このように、53の場合は各桁の3乗の和が152となり、元の数値53と一致しないため、アームストロング数とは判定されません。一方、371は「27+343+1=371」となり元の数値と一致するため、アームストロング数であることがわかります。

  1. Pythonで指定した数値がオーレ数(調和約数)かどうかを判定する方法

    ある数 n が与えられたとき、それがオーレ数(Ore number)であるかどうかを判定する方法を解説します。オーレ数とは「約数の調和平均が整数になる数」のことで、「調和約数(harmonic divisor number)」とも呼ばれています。 オーレ数とは? たとえば入力が 28 の場合を考えてみましょう。28 の約数は次の 6 個あります。 [1, 2, 4, 7, 14, 28] これらの約数の調和平均は次のように計算できます。 調和平均 = 6 ÷ (1/1 + 1/2 + 1/4 + 1/7 + 1/14 + 1/28) = 6 ÷ 2 = 3 計算結果が整数の 3 になるため、

  2. Pythonで数値がアキレス数かどうかを判定する方法

    ある整数 n が与えられたとき、その数がアキレス数(Achilles number)であるかどうかを判定しましょう。アキレス数とは、「べき乗数(powerful number)」であるにもかかわらず「完全累乗数」ではない数のことです。べき乗数とは、すべての素因数 p に対して p² もその数を割り切るような数 N を指します。一方、完全累乗数とは、mk(k ≥ 2)の形で表される数(例:平方数、立方数など)です。なお、アキレス数という名前はギリシャ神話の英雄アキレスにちなんだもので、「強力でありながら完全ではない」という「アキレスのかかと」の故事に由来しています。アキレス数の例としては、72、