C++
 Computer >> コンピューター >  >> プログラミング >> C++

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 - 1n - 2 を参照することで、どれほど大きな数でも即座に判定できます。
  • 先頭に不要な空白や符号が含まれる可能性がある場合は、事前に正規化しておくとより堅牢になります。

このように、巨大な数値の割り切り判定では、数全体を演算するのではなく「桁の性質」を利用することが重要です。20以外の数についても同様の手法(例えば4なら下2桁、8なら下3桁をチェックなど)で応用できます。

  1. Pythonで数値が19で割り切れるかどうかを判定する方法

    非常に大きな数値が与えられたとき、その数値が19で割り切れるかどうかを判定したいケースがあります。 例えば、入力が 86982 の場合、出力は「Divisible(割り切れる)」となります。 アルゴリズムの考え方:繰り返し加算法 この問題は「繰り返し加算法」と呼ばれる手法で解くことができます。この方法では、数値から末尾の1桁を取り出し、それを2倍した結果を残りの数値に加えるという操作を、数値が2桁になるまで繰り返します。そして最終的に得られた2桁の数値が19で割り切れるかどうかを調べます。 具体的な手順 数値が100以上である間(number // 100 が0でない間)、次の処理を繰り返し

  2. Pythonで数値が17で割り切れるかどうかを判定する方法

    ある数値が与えられたとき、その数値が17で割り切れるかどうかを判定する必要があるとします。例えば、入力が 99943 の場合、出力は「Divisible(割り切れる)」となります。解法のアプローチ:繰り返し減算法この問題は「繰り返し減算法」と呼ばれる手法で解くことができます。具体的には、数値の末尾の桁を取り出し、残りの数値から「末尾の桁 × 5」を引くという操作を、数値が2桁になるまで繰り返します。最終的に得られた2桁の数値が17で割り切れるなら、元の数値も17で割り切れることになります。この方法が成り立つ理由は、数値を「10a + b」(aは末尾の桁を除いた部分、bは末尾の桁)と表したとき、