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

【C++】巨大な数が8で割り切れるかどうかを判定する方法


本記事では、非常に大きな数が8で割り切れるかどうかを判定する方法を解説します。判定対象となる数は非常に大きいため、通常の整数型では扱えず、文字列として受け取って処理します。

ある数が8で割り切れるかどうかは、下3桁で作られる数が8で割り切れるかどうかだけで判断できます。これは、1000が8の倍数であることから導かれる性質です。1000より上の位の部分は必ず8の倍数になるため、下3桁だけを確認すれば十分です。

アルゴリズムの手順

判定は以下の手順で行います。

1. 数値を文字列として受け取る
2. 文字列の末尾3文字を取り出し、それぞれの文字を数値に変換して整数値を組み立てる
3. その値を8で割った余りが0かどうかを確認する

C++による実装例

#include <bits/stdc++.h>
using namespace std;
bool isDiv8(string num){
    int n = num.length();
    int last_three_digit_val = (num[n-3] - '0') * 100 + (num[n-2] - '0') * 10 + ((num[n-1] - '0'));
    if(last_three_digit_val % 8 == 0)
        return true;
    return false;
}
int main() {
    string num = "1754586672360";
    if(isDiv8(num)){
        cout << "Divisible";
    }else{
        cout << "Not Divisible";
    }
}

実行結果

Divisible

この例では、入力した数「1754586672360」の下3桁は「360」です。360 ÷ 8 = 45 となり余りが0なので、この数は8で割り切れると判定されます。

計算量について

この方法の利点は、文字列全体を走査する必要がない点です。末尾3桁のみを確認するため、計算量はO(1)の定数時間で済みます。数百桁・数千桁といった巨大な数でも、効率的に割り切り判定が可能です。

  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は末尾の桁)と表したとき、