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

Pythonで偶数桁の数字の積が奇数桁の数字の合計で割り切れるか判定する方法

ある数値 n が与えられたとき、偶数番目の桁にある数字の積奇数番目の桁にある数字の合計で割り切れるかどうかを判定します。ここで、桁の位置は右から左へ数え始め、いちばん右の桁を1桁目とします。

問題の例

たとえば、入力が n = 59361 の場合を考えてみましょう。

  • 偶数桁(2桁目・4桁目)の数字は「6」と「9」→ 積は 6 × 9 = 54
  • 奇数桁(1桁目・3桁目・5桁目)の数字は「1」「3」「5」→ 合計は 1 + 3 + 5 = 9

54 ÷ 9 = 6 となり余りが出ないため、この場合の出力は True になります。

解法のアプローチ

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

  • まず、数値 n の桁数を求めます(変数 digit_count)。
  • 合計を格納する total を 0、積を格納する prod を 1 で初期化します。
  • n が 0 より大きい間、以下の処理を繰り返します。
    • digit_count が偶数の場合:prodn の末尾の桁を掛けます。
    • それ以外の場合:totaln の末尾の桁を加算します。
    • n を 10 で整数除算し、処理済みの桁を削ります。
    • digit_count を 1 減らします。
  • ループ終了後、prodtotal で割り切れれば True を返し、そうでなければ False を返します。

実装例(Pythonコード)

それでは、実際のコードを見てみましょう。

from math import log10

def solve(n):
    digit_count = int(log10(n)) + 1
    total = 0
    prod = 1
    while n > 0:
        if digit_count % 2 == 0:
            prod *= n % 10
        else:
            total += n % 10

        n = n // 10
        digit_count -= 1

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

n = 59361
print(solve(n))

入力

59361

出力

True

コードのポイント

  • log10(n) を使うと桁数を簡単に求められます。たとえば log10(59361) は約 4.77 なので、整数部分の 4 に 1 を足して「5桁」と判断できます。
  • n % 10 で末尾の桁を取り出し、n // 10 でその桁を削除しています。これにより、数値を文字列に変換することなく各桁へ効率的にアクセスできます。
  • 桁を右から順に処理しながら digit_count を減らしていくことで、「今見ている桁が偶数桁か奇数桁か」をシンプルに判定できます。

なお、奇数桁の合計(total)が 0 になるケースが考えられる場合は、ゼロ除算エラーを避けるために割り算の前にチェックを追加しておくとより安全です。

  1. Pythonでリスト内の偶数と奇数をカウントする3つの方法を解説

    この記事では、リスト内に含まれる偶数と奇数の個数を数える方法について、具体的なコード例とともに解説します。問題の概要課題: 与えられたリストの中から、偶数と奇数がそれぞれいくつ含まれているかをカウントします。ここでは、以下の3つのアプローチを紹介します。それぞれ特徴が異なるため、用途やコードの可読性に応じて使い分けるのがおすすめです。方法1:forループを使った基本的な方法(総当たり方式)最もシンプルで直感的な方法です。拡張forループで各要素を順番に確認し、2で割った余りによって偶数か奇数かを判定します。コード例list1 = [21, 3, 4, 6, 33, 2, 3, 1, 3, 76

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

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