C++で大きな数が11で割り切れるかどうかを判定する方法
本記事では、C++を用いて、ある数が11で割り切れるかどうかを判定する方法を解説します。ここで扱うのは非常に大きな数であるため、int 型や long long 型といった標準的な整数型には収まりません。そこで、数値を文字列として受け取り、桁ごとに処理を行います。
11の倍数判定法とは
ある整数が11で割り切れるかどうかは、次の有名な判定法で簡単に確認できます。
- 左から順に各桁を見て、奇数番目の桁の合計と偶数番目の桁の合計をそれぞれ求める。
- 両者の差が0、または11の倍数であれば、その数は11で割り切れる。
特に、奇数番目の桁の合計と偶数番目の桁の合計が一致していれば、差は必ず0になるため、その数は確実に11で割り切れます。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
bool isDiv11(string num){
int n = num.length();
long odd_sum = 0, even_sum = 0;
// 各桁を走査し、位置ごとに合計を求める
for(int i = 0; i < n; i++){
if(i % 2 == 0){
odd_sum += num[i] - '0';
} else {
even_sum += num[i] - '0';
}
}
// 差が11の倍数(0を含む)なら割り切れる
return abs(odd_sum - even_sum) % 11 == 0;
}
int main() {
string num = "1234567589333892";
if(isDiv11(num)){
cout << "Divisible";
} else {
cout << "Not Divisible";
}
}
出力結果
Divisible
コードの解説
num[i] - '0' の部分では、文字として格納された数字を対応する整数値に変換しています。ループ内では、添字 i が偶数の桁を odd_sum に、奇数の桁を even_sum に加算していきます。最後に両者の差を計算し、その差が11の倍数であれば true を返します。
このアルゴリズムの計算量は、桁数を n とすると O(n)、必要な追加メモリは O(1) です。したがって、どれほど桁数が多い数でも、文字列として読み込めば線形時間で効率的に判定できます。
-
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は末尾の桁)と表したとき、