簡體   English   中英

預測添加數字的數字

[英]Predict the number from addition of numbers

有人問我這個算法問題,像往常一樣,我沒有回答這個問題。 :)讓我們說,你有一個號碼(稱之為)

504

下次,您看到它,您刪除該數字的最后一位數字。 變成(稱之為b)

50

下次,您看到它,您刪除該數字的最后一位數字。 變成(稱之為c)

5

現在,添加所有三個數字(a + b + c)。 它成為了 :

504 + 50 + 5 = 559

好吧,到現在為止你可能已經很好地理解了問題陳述。

問題是:如果給你添加三個數字a + b + c (在這種情況下為559),你怎么能回到原始數字(在這種情況下為504)? 所有解決方案將不勝感激。

假設您開始使用的數字看起來像xyz 也就是說,它的最后一個(十進制)數字是z ,它的倒數第二個數字是y ,其余數字是x 在您的示例中,如果以504開頭,則x = 5,y = 0,z = 4。 原始數字的值為100x + 10y + z。

你最終得到的數字是(100x + 10y + z),(10x + y)和x的總和。 這是111x + 11y + z。

注意,我們的約束是0≤y≤9和0≤z≤9。 即使它們具有最大值,我們也有11y +z≤11(9)+ 9 <111。因此我們可以反轉變換:拉出111的最大倍數,然后從剩余的中拉出11的最大倍數,然后還剩什么。

def transform(n):
    return n + (n/10) + (n/100)

def invert(m):
    [x, y, z] = [m/111, (m%111)/11, (m%111)%11]
    return 100*x + 10*y + z

assert transform(504) == 559 
assert invert(559) == 504

(在Python shell中嘗試上述操作。請注意,即使x不是一位數字,這也有效: transform(12345)給出13702,而invert(13702)給出12345,如預期的那樣。)


編輯 :一個替代解決方案,基於Paul Hankin的答案 (請贊成它)使用m*100/111 100/111作為起點的想法。 您當然可以使用該值作為粗略答案的(天花板)並嘗試添加1和2以獲得確切答案,但您也可以預先計算粗略答案所需的“偏移量”。

# Precomputation, to populate the "offset" dictionary
def sane_mod(a, m): return ((a % m) + m) % m
offset = {}
for y in range(10):
    for z in range(10):
        add = 10*y + 11*z
        offset[sane_mod(-add, 111)] = add

# Actual function
def invert2(m):
    rough = m * 100
    return (rough + offset[rough % 111]) / 111
assert invert2(559) == 504

a + b + c是a + a // 10 + a // 100(其中//表示向下舍入)。 這介於* 111/100 - 1.89和* 111/100之間。 (1.89,因為從// 10丟棄的最大分數是0.9,從// 100丟棄的最大分數是0.99,並且1.89 = 0.9 + 0.99)。

所以,給定一個+ b + c,我們正在尋找整數a,以便:

a * 111/100 - 1.89 <= a + b + c <= a * 111/100
a - 2.0979 <= (a + b + c) * 100 / 111 <= a

因此,令x = ceil((a + b + c)* 100/111),x,x + 1或x + 2中的一個必須是解。

暫無
暫無

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

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