C++のサンプルコードで学ぶDisarium数(ディザリウム数)の判定方法
Disarium数とは?
各桁の数字を、その桁の位置(最上位を1として左から順に1、2、3…)でべき乗し、その合計が元の数そのものと等しくなるような数をDisarium数(ディザリウム数)と呼びます。
例えば、518は次のように計算できます。
5^1 + 1^2 + 8^3 = 5 + 1 + 512 = 518
合計が元の数と一致しているため、518はDisarium数です。他にも 89、135、175、598 などがDisarium数の例として知られています。
noOfDigits関数:桁数を求める
noOfDigits(int num) 関数は、引数として受け取った数値の桁数を返します。数値を10で繰り返し割り、1の位だけが残るまで処理を続けることで桁数をカウントしています。ループのたびに変数 digits をインクリメントして桁数を追跡し、whileループが終了した時点でその値を返します。
int noOfDigits(int num){
int digits = 0;
int temp = num;
while (temp){
temp = temp / 10;
digits++;
}
return digits;
}isDisarium関数:Disarium数かどうかを判定する
続いて、isDisarium(int num) はブール型の関数で、受け取った数値がDisarium数であるかどうかを判定します。「num % 10」によって最右最右桁(一番右の桁)の数字を取り出し、それを対応する桁の位置でべき乗します。べき乗した結果は変数 sum に加算していき、whileループは桁がなくなるまで繰り返されます。最終的に sum が num と等しければ true を、そうでなければ false を返します。
bool isDisarium(int num){
int digits = noOfDigits(num);
int sum = 0;
int temp = num;
while (temp){
int rightDigit = temp % 10;
sum = sum + pow(rightDigit, digits--);
temp = temp / 10;
}
return (sum == num);
}注目すべきは pow(rightDigit, digits--) の部分です。べき乗に使用した直後に桁位置をデクリメントすることで、右側の桁から順に大きい位の指数が適用される仕組みになっています。
実装例
それでは、ある数がDisarium数かどうかを判定するプログラムの完全な実装を見てみましょう。
#include<iostream>
#include<math.h>
using namespace std;
int noOfDigits(int num){
int digits = 0;
int temp = num;
while (temp){
temp = temp / 10;
digits++;
}
return digits;
}
bool isDisarium(int num){
int digits = noOfDigits(num);
int sum = 0;
int temp = num;
while (temp){
int rightDigit = temp % 10;
sum = sum + pow(rightDigit, digits--);
temp = temp / 10;
}
return (sum == num);
}
int main(){
int num = 518;
if(isDisarium(num))
cout << num << " is a Disarium Number" << endl;
else
cout << num << " is not a Disarium Number" << endl;
return 0;
}実行結果
上記のコードを実行すると、次のような出力が得られます。
518 is a Disarium Number
まとめ
Disarium数の判定は、①桁数を求める、②各桁を取り出してその位置でべき乗する、③合計を元の数と比較する、という3つのステップで実現できます。処理回数は桁数に比例するため、非常に効率的なアルゴリズムです。ぜひ 89 や 135 など、他の数値でも試してみてください。
-
C++で算術数(約数の平均が整数になる数)を判定する方法
算術数とは算術数(Arithmetic Number)とは、その数のすべての正の約数の平均(相加平均)が整数になる数のことです。つまり、ある数 n について「約数の総和 ÷ 約数の個数」が割り切れる場合、その n は算術数であると定義されます。具体例で確認してみましょう。入力 : n = 6 出力 : YES 説明 : 約数は 1, 2, 3, 6 約数の総和 = 1 + 2 + 3 + 6 = 12 約数の個数 = 4 約数の総和 ÷ 約数の個数 = 12 / 4 = 3(整数なので算術数)なお、素数 p の場合、約数は 1 と p の2つだけなので平均は (1 + p) / 2 となります
-
C++のCHAR_BITとは?意味と使い方を解説
CHAR_BITは、char型が持つビット数を表すマクロです。C++では「limits.h」ヘッダーファイル(C++では<climits>)で宣言されており、一般的な環境では1バイトが8ビットであることを示します。このマクロを利用することで、移植性の高いコードを書くことができます。環境に依存せずにchar型のビット数を取得できるため、ビット演算やデータサイズの計算に役立ちます。CHAR_BITの使用例以下は、C++でCHAR_BITを使用したサンプルコードです。CHAR_BITとsizeofを組み合わせてint型の全ビット数を求め、整数値を2進数形式で出力しています。#includ