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

Pythonで偶数番目の桁の数字の積がKで割り切れるかどうかを判定する方法

ある整数 n と別の整数 k が与えられたとき、n の偶数番目の桁にある数字の積が k で割り切れるかどうかを判定します。ここで、桁の位置は右から左へ数えるものとし、最も右端の桁を 1 桁目とします。

例えば、入力が n = 59361 の場合を考えてみましょう。右から数えると、各桁の位置と数字は次のようになります。

  • 1桁目:1
  • 2桁目:6
  • 3桁目:3
  • 4桁目:9
  • 5桁目:5

偶数番目(2桁目と4桁目)の数字は 6 と 9 なので、その積は 6 × 9 = 54 となります。54 は 3 で割り切れるため、この場合の出力は True になります。

解決のためのアプローチ

この問題は、次の手順で解くことができます。

  • まず、数値 n の桁数(digit_count)を求めます。
  • 積を格納する変数 prod を 1 で初期化します。
  • n が 0 より大きい間、以下の処理を繰り返します。
    • 現在の桁位置(digit_count)が偶数であれば、その桁の数字(n を 10 で割った余り)を prod に掛けます。
    • n を 10 で整数除算し、処理済みの桁を取り除きます。
    • digit_count を 1 減らして、次の桁位置へ移動します。
  • ループ終了後、prod が k で割り切れれば True を返し、そうでなければ False を返します。

サンプルコード

from math import log10

def solve(n, k):
    digit_count = int(log10(n)) + 1
    prod = 1
    while n > 0:
        if digit_count % 2 == 0:
            prod *= n % 10
        n = n // 10
        digit_count -= 1

    if prod % k == 0:
        return True
    return False

n = 59361
k = 3
print(solve(n, k))

入力

59361, 3

出力

True

コードの解説

log10(n) を利用すると、数値 n の桁数を効率的に求めることができます。例えば log10(59361) ≒ 4.77 であるため、int() で小数部分を切り捨てて 1 を足すことで、5 桁の数であると判断できます。

ループの中では、n % 10 によって現在の最下位桁の数字を取り出し、n // 10 によってその桁を削除していきます。変数 digit_count は「今見ている桁が全体で何桁目か」を表しており、この値が偶数のときだけ積に反映することで、偶数番目の桁のみを正しく処理できます。

このアルゴリズムの計算量は桁数 d に対して O(d) となり、数値が大きくなっても高速に動作するのが特徴です。

  1. Pythonで数値が二面素数(Dihedral Prime)かどうかを判定する方法

    ある整数nが与えられたとき、それが「二面素数(dihedral prime)」であるかどうかを判定する方法を解説します。二面素数とは、その数自体が素数であり、さらに7セグメントディスプレイに表示した際に、表示の向き(通常の向きでも上下逆さまでも)に関わらず、同じ数または別の素数として読み取れる数のことです。例えば、入力がn = 1181の場合、出力はTrueになります。下の数字は上の数字を上下逆さま(180度回転)にして表示したものであり、どちらも素数となっています。アルゴリズムの手順この問題を解くために、以下の手順で進めます。up_side_down() 関数を定義します。引数としてnを受け

  2. 【Python】配列内のすべての桁を使って3で割り切れる数を作成できるか判定する方法

    この記事では、与えられた問題文を解決するための解法とアプローチについて詳しく解説します。 問題文 整数の配列が入力として与えられたとき、これらの数値に含まれるすべての桁を使用して、3で割り切れる整数を作成できるかどうかを判定する必要があります。 ここでは、整数の配列と配列の長さという2つの引数を受け取る関数を作成します。 解法のポイント この実装は、暗算でよく使われる数学的な性質に基づいています。それは次の通りです。 「ある数の各桁の合計が3で割り切れるならば、その数自体も3で割り切れる」 この性質を利用すると、実際に桁を組み合わせて数値を生成する必要はなく、配列内の各要素について3で割った余