C++で巨大な数値が20で割り切れるかどうかを判定する方法
この記事では、非常に大きな数値が20で割り切れるかどうかを判定する方法を解説します。数値が int 型や long long 型の範囲を超えるほど大きい場合、通常の数値型では扱えないため、文字列として受け取る必要があります。
判定の考え方
ある数が20で割り切れるためには、「その数が10で割り切れ、かつ10で割った商が2で割り切れる」という条件を満たす必要があります。これをもっとシンプルに考えると、次の2つの条件に整理できます。
- 条件1: 最後の桁(1の位)が「0」であれば、その数は10で割り切れる
- 条件2: 下から2番目の桁(10の位)が偶数であれば、10で割った商も2で割り切れる
つまり、末尾が「0」であり、かつ十の位が偶数であることが確認できれば、その数は20で割り切れると判定できます。実際に桁を2つ確認するだけなので、計算量はO(1)と非常に効率的です。
具体例
例として「54871584540」という数値を見てみましょう。
- 最後の桁は「0」→ 10で割り切れる ✓
- 下から2番目の桁は「4」→ 偶数なので条件を満たす ✓
両方の条件を満たしているため、54871584540は20で割り切れる数です。
C++での実装例
#include <bits/stdc++.h>
using namespace std;
bool isDiv20(string num){
int n = num.length();
// 最後の桁が0でなければ10で割り切れない
if(num[n - 1] != '0')
return false;
// 下から2番目の桁を数値に変換
int second_last = num[n - 2] - '0';
// 十の位が偶数なら20で割り切れる
if(second_last % 2 == 0)
return true;
return false;
}
int main() {
string num = "54871584540";
if(isDiv20(num)){
cout << "Divisible"; // 割り切れる
}else{
cout << "Not Divisible"; // 割り切れない
}
}出力結果
Divisible
コードのポイント
- 文字列の各桁は
char型として格納されているため、'0'を引くことで整数値に変換しています。 - 文字列の長さから末尾のインデックス
n - 1とn - 2を参照することで、どれほど大きな数でも即座に判定できます。 - 先頭に不要な空白や符号が含まれる可能性がある場合は、事前に正規化しておくとより堅牢になります。
このように、巨大な数値の割り切り判定では、数全体を演算するのではなく「桁の性質」を利用することが重要です。20以外の数についても同様の手法(例えば4なら下2桁、8なら下3桁をチェックなど)で応用できます。
-
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は末尾の桁)と表したとき、