6

ロシアの農民の掛け算/古代エジプトの掛け算を行うことになっているPython3.3のプログラムの助けが必要です。割り当ては、「「A」と「B」が乗算される2つの整数である場合、「B」がそれ以上除算できず、ゼロでなくなるまで、「A」を2で乗算し、「B」を2で除算することを繰り返します( 「A」の乗算と「B」の除算の各セットで、「B」の値が奇数の場合は、「A」の値を合計に加算します。最後に、すべての「A」値(「B」が奇数の場合)は、元の「A」と「B」の入力の積に等しくなければなりません。つまり、「B」が奇数であるすべての「A」値を合計します。そしてそれは"の積に等しい(または近い)でしょう

編集

私はいくつかの質問を間違って表現したかもしれません。

次に例を示します。

「A」が34、「B」が19の場合、「A」に2を掛け、「B」を各行に2で割ります。

「A」「B」

(34)(19)(「B」は奇数、合計に「A」を追加)

(68)(9)(「B」は奇数、合計に「A」を追加)

(136)(4)(「B」は偶数、「A」の値は無視)

(272)(2)(「B」は偶数、「A」の値は無視)

(544)(1)( "B"は奇数、合計に "A"を追加)

「B」が奇数である「A」のすべての値を合計すると、(34 + 68 + 544 = 646)が得られます。これは、「A」と「B」を掛けただけの値(34 * 19 = 646)です。 )。

私が問題を抱えているのは、「B」が奇数の場合は常に「A」を合計に追加することです。

これは私がこれまでに持っているものです、

x = int(input("What is the first number? "))
y = int(input("What is the second number? "))
answer = 0

while y != 0:
    if (y%2 != 0):
        x*2
        y//2
        answer == answer + x
    if (y%2 == 0):
        x*2
        y//2
print("the product is",(answer))

私はPythonとプログラミングに非常に慣れていないので、なぜそれが間違っているのかについてのヘルプや説明をいただければ幸いです。

4

4 に答える 4

3

私はあなたが実装しようとしているアルゴリズムに精通していませんが、あなたのコードにいくつかの変更を加えました。

x = int(input("What is the first number? "))
y = int(input("What is the second number? "))
answer = 0

# != 0 is redundant: y is True if it is not 0
while y:
    # no need to have parentheses here
    if y % 2:
        # this needs to be an assignment, not a check for equality
        answer += x  # shorthand for answer = answer + x
    # These happen every time, so does not need to be inside the if
    # these also need to be an assignment, not just an expression
    x *= 2
    y /= 2
# total was never defined
print("the product is", (answer))
于 2013-02-01T01:54:45.607 に答える
3

最初に答えるためにxを追加してから、xを更新する必要があります

これが正しいコードです

x = int(input("What is the first number? "))
y = int(input("What is the second number? "))
answer = 0

while y != 0:
   if (y%2 != 0):
      answer=answer+x
      x=x*2
      y=y//2
   if (y%2 == 0):
      x=x*2
      y=y//2

print("the product is",(answer))
于 2013-02-01T05:59:52.733 に答える
0

サイドノート。率直に言って、私は今までアルゴリズムについて知りませんでした。驚いたことに、それは古代エジプト人や古いロシアで使われていました。(実際、私は、スラブ諸国が古いエトルリア人と直接関係しているように見えるので、ロシアの起源がより可能性が高いと信じる傾向があります)。

古い起源は、実際にはあなたが基礎学校で学んだ単純な手作りの掛け算であるため、私を驚かせます。唯一の違いは、数値が最初に2進表現に変換されることです。むしろ機械志向ですね。:)

問題の数値の場合、10進数表現のth 34は2進数の100010に等しく、10進数の19は2進数の10011です。今、紙の上の単純な基本的な学校の掛け算:

    100010
x    10011
------------
    100010   i.e. 100010 times 1
   100010        1000100 times 1
  000000        10001000 times 0
 000000        100010000 times 0
100010        1000100000 times 1
------------                   ^ binary digits of the multiplier
1010000110                       (reminder of division by 2)
                       ^ adding the zero means multiplying by 2
i.e. sum only when 1 is the reminder of division

(古代に)メトッドを設計した人は、2進数が何であるかを知っていたようです。

于 2013-02-02T11:56:28.920 に答える
0

最後にxを追加するのは、yが1に等しいときです。数が0に達するまで半分を続けると、非常に多くの反復が必要になります(論理的には、永遠にかかります)。

2x2について考えてください。xを2倍にして4にし、yを半分にして1にすると、xが答えになります。

言い換えれば、と考えyhow many of x I need to yield answerください。掛け算はできないので、足し算/倍増/半分だけです。yが2になるまで待ってからxの2倍の値を足すか、yが1になるまで待ってxの値を足すだけです。後者はより単純で明確です、それだけです。

while Trueこの場合、ループを使用する方が明確だと思います。

def mult2(x, y):
    answer = 0
    while True:
        if y % 2:
            answer += x
        if y < 1:
            break
        x *= 2
        y //= 2
    print("the product is", answer)

関数を再帰的に呼び出す:

def mult2(x, y):
    """aka 'Russian peasant method'; allowed: addition, halving, doubling."""
    if y==1:
        return x
    else:
        add = x if y%2 else 0
        return mult2(x*2, y//2) + add
于 2014-10-18T16:58:11.890 に答える