簡體   English   中英

在不同基礎上進行大量操作的最快方法

[英]Fastest way to perform operations on very big numbers in different bases

我收到一個非常大的基於2 ^ k的數字的列表(k <= 30,數字數量<= 10 ^ 7)。

我需要做的是獲得兩個數字(我們叫它們X和Y),減去它們(A = XY,B = YX)並返回A和B的二進制表示形式。

我當前的代碼如下所示:

k = int(input())
base = pow(2, k)
numbersX = stdin.readline().split()
digitsX = len(numbersA) - 1

x = 0
i = 1
while i <= digitsX:
    factor = pow(base, digitsX - i)
    x += int(numbersX[i]) * factor
    i += 1

(與Y相似)

我只是簡單地將接收到的數字轉換為小數,然后減去並得到二進制表示。 它可以工作,但是非常慢。 您會建議其他解決方案嗎?

Sample input:
4 (for k)
6 15
2 7
So X = 6 15 = 6*16^1 + 15*16^0 = 96 + 15 = 111 (decimal)
Y = 2 7 = 2*16^1 + 7*16^0 = 32 + 7 = 39 (decimal)
A = X – Y = 111 – 39 = 72
B = Y – X = 39 – 111 = -72
Output:
01001000 (A in SM binary)
10111000 (B in U2 binary)

這是將任意基數轉換為整數的一種方法:

def to_int(digits, base=1024):
    place = 1
    ret = 0
    for digit in reversed(digits):
        ret += place*digit
        place *= base
    return ret

如果您的基數始終是2的冪( 2^10 = 1024 ),則也可以這樣做(可能效率更高):

def to_int2(digits, log2base=10):
    ret = 0
    for digit in digits:
        ret <<= log2base
        ret += digit
    return ret

然后將其表示為二進制字符串,您可以執行以下操作:

print('{:0b}'.format(to_int(digits=(981, 5, 0, 1001))))
print('{:0b}'.format(to_int2(digits=(981, 5, 0, 1001))))

兩者的結果是相同的(我假設最左邊是最高有效的“數字”;否則,您將不得不reverse “數字”的順序):

1111010101000000010100000000001111101001

(讀取輸入和減法應該很直接。)


對於您添加的示例,它將像這樣工作:

x = to_int2(digits=(6, 15), log2base=4)
y = to_int2(digits=(2, 7), log2base=4)

print(x, y) # 111 39
diff = x-y
print('{:08b}'.format(diff))         # 01001000
print('{:08b}'.format(-diff & 0xff)) # 10110111

如果您需要動態獲取格式和掩碼,可以嘗試執行以下操作:

d = 111-39
bit_length = max(int.bit_length(d), int.bit_length(-d))
fmt = '{{:0{}b}}'.format(bit_length+1)
mask = (1<<bit_length+1) - 1
print(fmt.format(d))
print(fmt.format(-d & mask))

不確定是否能正確覆蓋所有邊緣情況...但是我敢肯定,您可以從那里得到正確的選擇!

你可以消除pow

x = 0
i = 1
while i <= digitsX:
    x *= base
    x += int(numbersX[i])
    i += 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM