Python長整數運算
- 正整數運算
- 正整數相加-對位相加
- 正整數相減-對位相減
- 整數運算
正整數運算
??這次,我們加法采用對位相加,也就是兩個長整數對應位上的數字相加,之后再計算進位,最后得出結果的方法,
正整數相加-對位相加
| 例如 | 數字 |
|---|---|
| 被加數 | 1111 |
| 加數 | 99999 |
??先將數字串分割為獨立的數字,再對位相加,
| ··· | 十萬 | 萬位 | 千位 | 百位 | 十位 | 個位 |
|---|---|---|---|---|---|---|
| 被加數 | 0 | 0 | 1 | 1 | 1 | 1 |
| + | + | + | + | + | + | + |
| 加數 | 0 | 9 | 9 | 9 | 9 | 9 |
| 結果 | 0 | 9 | 10 | 10 | 10 | 10 |
??之后是處理進位,
| ··· | 十萬 | 萬位 | 千位 | 百位 | 十位 | 個位 |
|---|---|---|---|---|---|---|
| 個位進位 | 0 | 9 | 10 | 10 | 10+1 | ←0 |
| 十位進位 | 0 | 9 | 10 | 10+1 | ←1 | 0 |
| 百位進位 | 0 | 9 | 10+1 | ←1 | 1 | 0 |
| 千位進位 | 0 | 10 | ←1 | 1 | 1 | 0 |
| 萬位進位 | 0+1 | ←0 | 1 | 1 | 1 | 0 |
| 最終結果 | 1 | 0 | 1 | 1 | 1 | 0 |
??上代碼:
# 大正整數相加
def SUM():
# 分割數字字串
num1 = list(input())
num2 = list(input())
# 分割字串從右對齊逐個相加存入temp
len1 = len(num1)
len2 = len(num2)
count = max(len1, len2)
index = 0
temp = [0 for i in range(count+1)]
if len1 > len2: # 哪個數更長的操作
index = len2-1
else:
index = len1-1
for i in range(count, 0, -1):
if len1 > len2:
if index >= 0:
temp[i] += int(num2[index])
index -= 1
temp[i] += int(num1[i-1])
else:
if index >= 0:
temp[i] += int(num1[index])
index -= 1
temp[i] += int(num2[i-1])
# 判斷是否有進位
for i in range(count, -1, -1):
if temp[i] > 9:
temp[i] = temp[i] % 10
temp[i-1] += 1
temp[i] = str(temp[i])
# 無進位,刪掉抬頭0
if temp[0] == '0':
temp.pop(0)
count -= 1
# 大整數連接起來
Sum = ''
for i in range(count+1):
Sum += temp[i]
print(Sum)
??加數和被加數倒過來也一樣,但是涉及到誰的位數更大一些,代碼上需要判斷一下,因為代碼中保存對位相加結果的變數temp[]的長度是按最長的整數的長度而定的(多一位,因為可能會進位),
正整數相減-對位相減
??整數相減不同于相加,被減數和減數不能隨意顛倒位置,但是我們仍可以使用對位相減的方法,只是需要限制,
??減法,實質上是求兩個數的距離,例如:
9999 ? 91111 = ? ( 91111 ? 9999 ) 9999 - 91111 = - ( 91111 - 9999 ) 9999?91111=?(91111?9999)
??那么這樣的話,我們可以將更大的數字始終作為被減數,只需要在結果判斷是否添加負號即可,
| 例如 | 數字 |
|---|---|
| 被減數 | 9999 |
| 減數 | 91111 |
??同加法,分割字符,但是減數更大,將減數變成被減數,被減數變為減數,結果添負:
| ··· | 符號 | 萬位 | 千位 | 百位 | 十位 | 個位 |
|---|---|---|---|---|---|---|
| 被減數 | - | 9 | 1 | 1 | 1 | 1 |
| - | - | - | - | - | - | |
| 減數 | - | 9 | 9 | 9 | 9 | |
| 結果 | - | 9 | -8 | -8 | -8 | -8 |
??之后是處理借位,
| ··· | 符號 | 萬位 | 千位 | 百位 | 十位 | 個位 |
|---|---|---|---|---|---|---|
| 結果 | - | 9 | -8 | -8 | -8-1→ | 10-8 |
| 結果 | - | 9 | -8 | -8-1→ | 10-9 | 2 |
| 結果 | - | 9 | -8-1→ | 10-9 | 1 | 2 |
| 結果 | - | 9-1→ | 10-9 | 1 | 1 | 2 |
| 最終結果 | - | 8 | 1 | 1 | 1 | 2 |
??那么問題來了! 能不能小的減大的呢,這不省掉了判斷大小那一步嗎?
??我們試一試:
| ··· | 符號 | 萬位 | 千位 | 百位 | 十位 | 個位 |
|---|---|---|---|---|---|---|
| 被減數 | + | 9 | 9 | 9 | 9 | |
| - | - | - | - | - | - | |
| 減數 | + | 9 | 1 | 1 | 1 | 1 |
| 結果 | + | -9 | 8 | 8 | 8 | 8 |
??之后是處理借位,這里我發現一個規律,就是最高位是負的,需要向更高位借位,但是沒有更高位了,頭禿,
??但是,我發現將結果每位都取負,然后結果符號也取負,
??結果如下:
| ··· | 符號 | 萬位 | 千位 | 百位 | 十位 | 個位 |
|---|---|---|---|---|---|---|
| 結果 | - | 9 | -8 | -8 | -8 | -8 |
| 最終結果 | - | 8 | 1 | 1 | 1 | 2 |
??頭禿,是可以的,但是也OK,代碼也被簡化了,上代碼:
# 大正整數相減
def SUB():
# 分割數字字串
num1 = list(input())
num2 = list(input())
# 分割字串從右對齊被減數加操作,減數減操作存入temp
len1 = len(num1)
len2 = len(num2)
count = max(len1, len2)
index = 0
symbol = 0
temp = [0 for i in range(count)]
if len1 > len2:
index = len2 - 1
else:
index = len1 - 1
for i in range(count-1, -1, -1):
if len1 > len2:
if index >= 0:
temp[i] -= int(num2[index])
index -= 1
temp[i] += int(num1[i])
else:
if index >= 0:
temp[i] += int(num1[index])
index -= 1
temp[i] -= int(num2[i])
# 判斷結果是否有0前綴,有則去除
while temp[0] == 0:
if len(temp) == 1 and temp[0] == 0:
print(0)
return
temp.pop(0)
count -= 1
# 符號置換,使最高位能夠借位給低位
if temp[0] < 0:
symbol = 1
for i in range(count):
temp[i] = temp[i] * (-1)
#判斷借位
for i in range(count-1, -1, -1):
if temp[i] < 0:
temp[i] += 10
temp[i-1] -= 1
#添加結果符號
if symbol == 1:
sub = "-"
for i in range(count):
sub += str(temp[i])
print(sub)
else:
sub = ""
for i in range(count):
sub += str(temp[i])
print(sub)
整數運算
整理中~
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/171347.html
標籤:其他
上一篇:2.5 Python面向物件
