C++で巨大な数値が9で割り切れるかどうかを判定する方法
本記事では、ある数値が9で割り切れるかどうかを判定する方法を解説します。対象となる数値は非常に大きいため、通常の整数型では扱いきれず、文字列として受け取る必要があります。
9の倍数の判定ルール
数学でよく知られた性質として、「各桁の数字の合計が9で割り切れるならば、その数自身も9で割り切れる」というものがあります。この性質を利用すれば、どれほど巨大な数値でも、文字列として各桁を処理するだけで簡単に判定できます。
アルゴリズムの手順
- 数値を文字列として受け取る
- 各桁の数字をすべて合計する
- 合計が9で割り切れれば「割り切れる」、そうでなければ「割り切れない」と判定する
C++による実装例
#include <bits/stdc++.h>
using namespace std;
bool isDiv9(string num){
int n = num.length();
long sum = accumulate(begin(num), end(num), 0) - '0' * n;
if(sum % 9 == 0)
return true;
return false;
}
int main() {
string num = "630720";
if(isDiv9(num)){
cout << "Divisible";
} else {
cout << "Not Divisible";
}
}出力結果
Divisible
コードの解説
このコードでは、STLのaccumulate関数を使って、文字列内の全文字のASCIIコード値の合計を計算しています。各文字には文字「'0'」分のコード値が余分に含まれているため、文字数 n に「'0'」の値を掛けた分を差し引くことで、実際の各桁の数字の合計を求めています。
例として「630720」を挙げると、各桁の合計は 6 + 3 + 0 + 7 + 2 + 0 = 18 となり、18は9で割り切れるため、元の数値も9で割り切れると判定されます。この手法なら、long long型や多倍長演算ライブラリを使わなくても、任意の桁数の数値を効率的にチェックできます。
-
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は末尾の桁)と表したとき、