C++で巨大な数値が15で割り切れるかどうかを判定する方法
本記事では、ある数値が15で割り切れるかどうかを判定する方法を解説します。ここで扱う数値は非常に大きいため、通常の整数型では表現しきれず、文字列として扱います。
15の倍数判定の考え方
数値が15で割り切れるためには、「5で割り切れる」かつ「3で割り切れる」という2つの条件を満たす必要があります。これは、15 = 5 × 3 であり、5と3が互いに素であるためです。
- 5で割り切れる条件: 最後の桁(1の位)が「0」または「5」であること
- 3で割り切れる条件: 各桁の数字の合計が3で割り切れること
C++での実装例
#include <bits/stdc++.h>
using namespace std;
bool isDiv15(string num){
int n = num.length();
if(num[n - 1] != '5' && num[n - 1] != '0')
return false;
long sum = accumulate(begin(num), end(num), 0) - '0' * n;
if(sum % 3 == 0)
return true;
return false;
}
int main() {
string num = "154484585745184258458158245285260";
if(isDiv15(num)){
cout << "Divisible";
} else {
cout << "Not Divisible";
}
}
コードの解説
isDiv15関数は、以下の手順で判定を行っています。
- まず、文字列の最後の文字が「5」または「0」であるかを確認し、該当しなければ即座に
falseを返します(5の倍数判定)。 - 次に、
accumulate関数で各桁の文字コードの合計を計算し、そこから'0' × 桁数を引くことで、実際の各桁の数字の合計値を求めます。 - 合計が3で割り切れれば
true、そうでなければfalseを返します。
実行結果
Divisible
このように、巨大な数値でも文字列として処理すれば、整数型のオーバーフローを気にすることなく、15の倍数かどうかを簡単に判定できます。同様の手法は、他の合成数の倍数判定にも応用可能です。
-
Pythonで数値が19で割り切れるかどうかを判定する方法
非常に大きな数値が与えられたとき、その数値が19で割り切れるかどうかを判定したいケースがあります。 例えば、入力が 86982 の場合、出力は「Divisible(割り切れる)」となります。 アルゴリズムの考え方:繰り返し加算法 この問題は「繰り返し加算法」と呼ばれる手法で解くことができます。この方法では、数値から末尾の1桁を取り出し、それを2倍した結果を残りの数値に加えるという操作を、数値が2桁になるまで繰り返します。そして最終的に得られた2桁の数値が19で割り切れるかどうかを調べます。 具体的な手順 数値が100以上である間(number // 100 が0でない間)、次の処理を繰り返し
-
Pythonで数値が17で割り切れるかどうかを判定する方法
ある数値が与えられたとき、その数値が17で割り切れるかどうかを判定する必要があるとします。例えば、入力が 99943 の場合、出力は「Divisible(割り切れる)」となります。解法のアプローチ:繰り返し減算法この問題は「繰り返し減算法」と呼ばれる手法で解くことができます。具体的には、数値の末尾の桁を取り出し、残りの数値から「末尾の桁 × 5」を引くという操作を、数値が2桁になるまで繰り返します。最終的に得られた2桁の数値が17で割り切れるなら、元の数値も17で割り切れることになります。この方法が成り立つ理由は、数値を「10a + b」(aは末尾の桁を除いた部分、bは末尾の桁)と表したとき、