C言語でアームストロング数を判定するプログラムの作成方法
アームストロング数とは?
本記事では、入力された整数 n がアームストロング数(Armstrong number)であるかどうかを判定するCプログラムについて解説します。
アームストロング数とは、各桁の数字をそれぞれ「桁数(位数)」でべき乗し、その総和が元の数値と等しくなる数のことです。例えば、4桁の数 1634 は 14 + 64 + 34 + 44 = 1 + 1296 + 81 + 256 = 1634 となるため、アームストロング数です。
アームストロング数を求める基本的な考え方は、次の式のように表せます。
計算式:
wxyz…. = pow(w, n) + pow(x, n) + pow(y, n) + pow(z, n) + …..
なお、3桁のアームストロング数としては 153、370、371、407 などがよく知られています。
アルゴリズム
開始
ステップ1 -> べき乗演算を行う関数を宣言
int power(int a, int b)
b > 0 の間ループ
power = power * a を計算
b を 1 減らす
ループ終了
power を返す
終了
ステップ2 -> 数値の桁数(位数)を数える関数を宣言
int count(int n)
i を 0 で宣言・初期化
n != 0 の間ループ
i を 1 増加させる
n / 10 を計算して n に再代入
ループ終了
i を返す
終了
ステップ3 -> アームストロング数の判定値を計算する関数を宣言
int armstrong(int n)
x を宣言し、count(n) の戻り値を代入
rem = 0、m = 0 として初期化
n が 0 以外の間ループ
rem = n % 10 を計算
m = m + power(rem, x) を計算
n = n / 10 を計算
ループ終了
m を返す
終了
ステップ4 -> main 関数を宣言
int main(int argc, char const *argv[])
n = 1634 として初期化
armstrong 関数を呼び出し、戻り値が n と等しいか判定
等しければ「アームストロング数です」と出力
それ以外の場合
「アームストロング数ではありません」と出力
終了
停止
サンプルコード
#include <stdio.h>
// a の b 乗を計算する関数
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 armstrong(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 == armstrong(n)){
printf("%d is an armstrong number \n", n);
}
else
printf("%d isn't an armstrong number \n", n);
return 0;
}
実行結果
1634 is an armstrong number
このように、1634 は各桁の4乗の和が元の数値と一致するため、「アームストロング数」と判定されます。
まとめ
本プログラムでは、べき乗を計算する power 関数、桁数を数える count 関数、各桁の冪乗和を求める armstrong 関数の3つを組み合わせることで、任意の整数がアームストロング数かどうかを効率的に判定できます。さらに scanf を使ってユーザーからの入力を受け付けるようにすれば、任意の数値に対して柔軟に判定を行うことも可能です。
-
C言語で最初のn個の自然数の立方和を求めるプログラム
この記事では、最初のn個の自然数(1からnまで)の立方和を求める方法について解説します。基本的なアプローチとしては、1からnまで繰り返すforループを1つ使い、各ステップでその項の立方を計算して合計に加算していきます。この方法の計算量はO(n)です。しかし、O(1)つまり定数時間でこの問題を解きたい場合は、以下の級数の公式を利用できます。1³ + 2³ + 3³ + … + n³ = {n(n+1)/2}²アルゴリズムcubeNNatural(n)begin sum := 0 for i in range 1 to n, do sum := sum + i^3
-
Pythonでフィボナッチ数を求める方法:再帰と動的計画法の2つのアプローチを徹底解説
本記事では、「n番目のフィボナッチ数を計算する」という問題に対する解決策と考え方を、2つの異なるアプローチ(再帰的手法と動的計画法)のコード例とともにわかりやすく解説します。 問題の概要 今回の課題は、n番目のフィボナッチ数を求めることです。 フィボナッチ数列 Fn は、次の漸化式によって定義されます。 Fn = Fn-1 + Fn-2 初期値(シード値)は以下の通りです。 F0 = 0、F1 = 1 この問題を解くには、主に次の2つの方法があります。 再帰的なアプローチ 動的計画法によるアプローチ アプローチ1:再帰的な手法 まずは、定義そのものをそのままコードに反映させた再帰的な実