C++で巨大な数値が2・3・5で割り切れるかを判定する方法
本記事では、非常に大きな数値が2・3・5のすべてで割り切れるかどうかを判定する方法を解説します。対象となる数は桁数が非常に大きいため、通常の整数型では扱えません。そこで、数値を文字列(string)として受け取り、各桁を調べることで判定を行います。
判定の考え方:最小公倍数を使う
ある数が2・3・5のすべてで割り切れるということは、その数がこれらの最小公倍数(LCM)で割り切れることと同じです。
- 2、3、5の最小公倍数は 30
- つまり「30で割り切れるか」を判定すればよい
さらに、30で割り切れる条件は次のように分解できます。
- 10で割り切れる → 最後の桁(1の位)が「0」である
- 3で割り切れる → 全桁の数字の合計が3の倍数である
この2つの条件を満たせば、その数は30(=2×3×5)で割り切れると判断できます。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
bool isDiv30(string num){
int n = num.length();
// 条件1: 最後の桁が '0' かどうか(10で割り切れるか)
if(num[n - 1] != '0')
return false;
// 条件2: 各桁の合計が3の倍数かどうか
long sum = accumulate(begin(num), end(num), 0) - '0' * n;
if(sum % 3 == 0)
return true;
return false;
}
int main() {
string num = "353730746028908374890";
if(isDiv30(num)){
cout << "Divisible"; // 割り切れる
} else {
cout << "Not Divisible"; // 割り切れない
}
}実行結果
Divisible
コードのポイント
num[n - 1] != '0'で文字列の末尾の文字を確認し、10の倍数かどうかを判定しています。accumulateを使って全桁のASCIIコード値を合計し、'0' * nを引くことで実際の数字の合計を求めています。- この手法なら、どれほど桁数が大きい数でも文字列として処理できるため、オーバーフローの心配がありません。
計算量は文字列の長さに比例する O(n) であり、巨大な数値でも高速に判定できます。
-
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は末尾の桁)と表したとき、