3桁のオシリス数とは?C++で判定するプログラムを解説
オシリス数(Osiris Number)とは?
オシリス数とは、自分自身の桁の数字から作られる部分順列の総和が、元の数とちょうど等しくなる特殊な数のことです。例として「132」という数を見てみましょう。この数の各桁から作られる2桁の組み合わせは {12 + 21 + 13 + 31 + 23 + 32} ですが、これらをすべて足し合わせると132になります。つまり、132はオシリス数だということです。
この記事では、与えられた3桁の整数がオシリス数かどうかを判定するプログラムをC++で紹介します。
判定のアプローチ
一見複雑そうに思えますが、この問題は非常にシンプルに解けます。ポイントは、3桁の数における各桁の数字は、すべての2桁順列の中で「1の位」と「10の位」にそれぞれ2回ずつ現れるということです。
したがって、入力された数 n が「各桁の和 × 22」に一致すれば、その数はオシリス数であると判定できます。
アルゴリズム
isOsirisNumber(n) −
Begin a := 最下位の桁(1の位) b := 中央の桁(10の位) c := 最上位の桁(100の位) digit_sum := a + b + c if n = (22 * digit_sum), then return true end if return false End
なぜ「22倍」で計算できるのか?
3桁の数 abc の2桁順列をすべて足し合わせると、以下のように整理できます。
(10a+b) + (10b+a) + (10a+c) + (10c+a) + (10b+c) + (10c+b) = 22(a+b+c)
各数字が1の位と10の位にそれぞれ2回ずつ登場するため、順列全体の合計は必然的に「各桁の和の22倍」になるのです。この性質を使えば、順列を実際に生成しなくても一発で判定できます。
C++による実装例
#include <iostream>
using namespace std;
bool isOsirisNumber(int n) {
int a = n % 10;
int b = (n / 10) % 10;
int c = n / 100;
int sum = a + b + c;
if (n == (22 * sum)) {
return true;
}
return false;
}
int main() {
int n = 132;
if (isOsirisNumber(n))
cout << "This is Osiris number";
else
cout << "This is Not Osiris number";
}出力結果
This is Osiris number
-
数値を英語の単語に変換するCプログラムの書き方
数値で構成された文字列が与えられたとき、その数値を英語の単語(スペル表記)へ変換するのが本記事の課題です。例えば、入力が「361」であれば、出力は「Three hundred sixty one」となるようにします。この問題を解くためには、一の位・十の位・百の位・千の位など、それぞれの数字がどの桁に位置しているのかを意識することが重要です。なお、今回紹介するコードは最大4桁、つまり0から9999までの数値に対応しています。したがって、入力は0〜9999の範囲である必要があります。例として「1,111」を考えてみましょう。各桁は以下のように対応します。千の位:1(one thousand)百の位
-
C言語でプラス完全数(Armstrong数)を判定するプログラム
n桁の整数xが与えられたとき、その数が「プラス完全数(Plus Perfect Number)」であるかどうかを判定するのが本記事のテーマです。プラス完全数とは、各桁の数字dを桁数nでべき乗した値(dn)をすべて合計し、その合計が元の数と一致する場合を指します。この考え方は、いわゆる「Armstrong数(ナルシシスト数)」の判定とまったく同じものです。 具体例 入力:163 出力:完全数ではない 説明:1³ + 6³ + 3³ = 244 となり、163と一致しないため 入力:371 出力:完全数である 説明:3³ + 7³ + 1³ = 371 となり、元の数と一致するため 上記の例のよ