C++で数値が41で割り切れるかどうかを判定する方法
本記事では、与えられた数値が41で割り切れるかどうかを判定するC++プログラムを紹介します。例として、104413920565933という大きな数値を取り上げます。この数値は実は41で割り切れます。
巨大な数値を実際に割り算せずに判定するには、次の「41の倍数判定法」を利用します。
41で割り切れるかの判定ルール
- 元の数(または切り捨て後の数)から、末尾の一桁を取り出す。
- 残りの数(末尾を切り捨てた数)から、「4 × 取り出した一桁」を引く。
- 必要な限り、この手順を繰り返す。
最終的に得られた小さな数が41の倍数であれば、元の数も41で割り切れることになります。これは「10a + b が41の倍数 ⟺ a − 4b が41の倍数」という性質に基づいています(10 × (a − 4b) = 10a − 40b ≡ 10a + b (mod 41) となるためです)。
計算例:30873の場合
30873 → 3087 − 4×3 = 3075 3075 → 307 − 4×5 = 287 287 → 28 − 4×7 = 0 0は41の倍数なので、30873は41で割り切れる
このように、数値をどんどん小さくしながら判定できるのがこの方法の利点です。
C++プログラム例
#include <iostream>
#include <algorithm>
using namespace std;
bool isDivisibleBy41(long long int n) {
while (n / 100) {
int last = n % 10;
n /= 10; // 末尾の一桁を切り捨てる
n -= last * 4;
}
return (n % 41 == 0);
}
int main() {
long long number = 104413920565933;
if(isDivisibleBy41(number))
cout << "Divisible";
else
cout << "Not Divisible";
}実行結果
Divisible
このプログラムでは、whileループ内で毎回末尾の一桁を取り出し、残りの数から「4 × その一桁」を引いていくことで、数値を効率的に縮小しています。数値が十分に小さくなった時点で41による剰余を計算し、割り切れるかどうかを返します。long long型を使用することで、104413920565933のような15桁の大きな整数にも対応できます。
-
C++で巨大な数値が2・3・5で割り切れるかを判定する方法
本記事では、非常に大きな数値が2・3・5のすべてで割り切れるかどうかを判定する方法を解説します。対象となる数は桁数が非常に大きいため、通常の整数型では扱えません。そこで、数値を文字列(string)として受け取り、各桁を調べることで判定を行います。判定の考え方:最小公倍数を使うある数が2・3・5のすべてで割り切れるということは、その数がこれらの最小公倍数(LCM)で割り切れることと同じです。2、3、5の最小公倍数は 30つまり「30で割り切れるか」を判定すればよいさらに、30で割り切れる条件は次のように分解できます。10で割り切れる → 最後の桁(1の位)が「0」である3で割り切れる → 全桁
-
C++で大きな数が11で割り切れるかどうかを判定する方法
本記事では、C++を用いて、ある数が11で割り切れるかどうかを判定する方法を解説します。ここで扱うのは非常に大きな数であるため、int 型や long long 型といった標準的な整数型には収まりません。そこで、数値を文字列として受け取り、桁ごとに処理を行います。 11の倍数判定法とは ある整数が11で割り切れるかどうかは、次の有名な判定法で簡単に確認できます。 左から順に各桁を見て、奇数番目の桁の合計と偶数番目の桁の合計をそれぞれ求める。 両者の差が0、または11の倍数であれば、その数は11で割り切れる。 特に、奇数番目の桁の合計と偶数番目の桁の合計が一致していれば、差は必ず0になるた