web-dev-qa-db-ja.com

pythonで負の数を扱う

私はプログラミングクラスの概念の学生です。ラボはTAによって運営されており、今日のラボでは、ビルドするための実際のシンプルな小さなプログラムを提供してくれました。足し算で乗るところだった。とにかく、彼は私たちに絶対的なものを使って、ネガでプログを壊さないようにしました。私はそれをすぐに打ち上げてから、それは悪い数学だと彼と10分間主張しました。 4 * -5は20ではなく、-20でした。彼はそれについて本当に気にしないで、とにかくprogにネガを処理させることは難しいでしょうと彼は言った。だから私の質問はこれについてどうやって行くのですか?.

これが私が提出したPROGです:

#get user input of numbers as variables

numa, numb = input("please give 2 numbers to multiply seperated with a comma:")

#standing variables
total = 0
count = 0

#output the total
while (count< abs(numb)):
    total = total + numa
    count = count + 1

#testing statements
if (numa, numb <= 0):
    print abs(total)
else:
    print total

絶対に使わないでやりたいのですが、負の数を入力するたびに大きな太ったグースグが出てきます。それを行う簡単な方法があることは知っていますが、それを見つけることができません。

12
dman762000

おそらく、あなたはこれを何かの効果で達成するでしょう

text = raw_input("please give 2 numbers to multiply separated with a comma:")
split_text = text.split(',')
a = int(split_text[0])
b = int(split_text[1])
# The last three lines could be written: a, b = map(int, text.split(','))
# but you may find the code I used a bit easier to understand for now.

if b > 0:
    num_times = b
else:
    num_times = -b

total = 0
# While loops with counters basically should not be used, so I replaced the loop 
# with a for loop. Using a while loop at all is rare.
for i in xrange(num_times):
    total += a 
    # We do this a times, giving us total == a * abs(b)

if b < 0:
    # If b is negative, adjust the total to reflect this.
    total = -total

print total

または多分

a * b
5
Mike Graham

あまりにもハード?あなたのTAは……まあ、そのフレーズはおそらく私を禁止するでしょう。とにかく、numbが負かどうかを確認してください。場合は、numaに_-1_を乗算し、numb = abs(numb)を実行します。次にループを行います。

While条件のabs()が必要です。これは、反復回数を制御するためです(負の反復回数をどのように定義しますか?)。 numbが負の場合、結果の符号を反転することで修正できます。

したがって、これはコードの修正バージョンです。注意:whileループをクリーナーのforループに置き換えました。

#get user input of numbers as variables
numa, numb = input("please give 2 numbers to multiply seperated with a comma:")

#standing variables
total = 0

#output the total
for count in range(abs(numb)):
    total += numa

if numb < 0:
    total = -total

print total
3
slacker

TAでこれを試してください:

# Simulate multiplying two N-bit two's-complement numbers
# into a 2N-bit accumulator
# Use shift-add so that it's O(base_2_log(N)) not O(N)

for numa, numb in ((3, 5), (-3, 5), (3, -5), (-3, -5), (-127, -127)):
    print numa, numb,
    accum = 0
    negate = False
    if numa < 0:
        negate = True
        numa = -numa
    while numa:
        if numa & 1:
            accum += numb
        numa >>= 1
        numb <<= 1
    if negate:
        accum = -accum
    print accum

出力:

3 5 15
-3 5 -15
3 -5 -15
-3 -5 15
-127 -127 16129
1
John Machin

皆さん、ありがとうございました。たくさんのことを学んでいただきました。これは私があなたの提案のいくつかを使用して思いついたものです

#this is apparently a better way of getting multiple inputs at the same time than the 
#way I was doing it
text = raw_input("please give 2 numbers to multiply separated with a comma:")
split_text = text.split(',')
numa = int(split_text[0])
numb = int(split_text[1])

#standing variables
total = 0

if numb > 0:
    repeat = numb
else:
    repeat = -numb

#for loops work better than while loops and are cheaper
#output the total
for count in range(repeat):
    total += numa


#check to make sure the output is accurate
if numb < 0:
    total = -total


print total

みんなの助けに感謝します。

0
dman762000

そのようなものはどうですか? (abs()も乗算も使用しません)
ノート:

  • abs()関数は、最適化トリックでのみ使用されます。このスニペットは削除または再コーディングできます。
  • 各反復でaとbの符号をテストしているため、ロジックの効率は低くなります(abs()と乗算演算子の両方を回避するために支払う価格)

def multiply_by_addition(a, b):
""" School exercise: multiplies integers a and b, by successive additions.
"""
   if abs(a) > abs(b):
      a, b = b, a     # optimize by reducing number of iterations
   total = 0
   while a != 0:
      if a > 0:
         a -= 1
         total += b
      else:
         a += 1
         total -= b
   return total

multiply_by_addition(2,3)
6
multiply_by_addition(4,3)
12
multiply_by_addition(-4,3)
-12
multiply_by_addition(4,-3)
-12
multiply_by_addition(-4,-3)
12
0
mjv