筆算の位ごとの置き場に積を足し、数字の文字列どうしを掛ける

10 進の数字だけでできた 2 つの文字列の積を、文字列で返します。大きい整数の型に直さず、桁どうしの積を筆算の位ごとの置き場に足し、最後に繰り上げをまとめる練習です。

海外で定番の問題リスト 4 本には入っていません

問題

電卓の道具で、とても長い数を扱います。0 以上の整数を 10 進で書いた文字列 a と b を受け取り、その積を 10 進の文字列で返す関数を書いてください。

  • 数の型や大きい整数の型 (Python の int()、JavaScript の BigInt、Go の math/big など) に直さず、桁ごとに計算してください
  • a と b は数字だけでできていて、"0" のときを除き先頭は "0" ではありません
  • 答えも、"0" のときを除き先頭に "0" を付けません
  • a と b の長さは 1 以上 200 以下です

入力と出力の例

例 1

a = "45" b = "12"
"540"

例 2

どちらかが 0 なら、答えは "0" です。"000" にはしません。

a = "999" b = "0"
"0"

例 3

途中に 0 の桁があっても、位はずれません。

a = "807" b = "96"
"77472"

面接での聞かれ方

面接では、桁の扱いと添え字の計算を見る問題として出されます。

  • 「文字列で渡された 2 つの数を掛けてください。整数に変換してはいけません」
  • 筆算のように、段ごとの足し算を作ってから全部を足す書き方を見せると、「途中の文字列を作らずにできますか?」と続きます
  • 「答えは最大で何桁になりますか?」と聞かれることもあります

芯は、a の i 桁目と b の j 桁目の積が、答えのどの位に落ちるかを式で言えることです。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def multiply_strings(a: str, b: str) -> str:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(multiply_strings("45", "12"))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します