2017-01-05 73 views
0

這不是家庭作業=)。我在做一個項目,它會自動生成順序計算機名稱列表,如果列表將會是一個瘋狂的長列表,我想添加一個警告。Math - 查找兩個字符串之間的排列數

我知道如何找到比如說A-ZZZ排列的數目,但我有一個時間赫克嘗試應用的容斥集。這裏是場景,爲了簡單起見,字符集只會是A - Z,不區分大小寫,所以「A」=「a」。

用戶輸入「ABC」到「AX」的範圍。所以我需要的唯一數字就是在這兩者之間。所以psudo邏輯會得到A - ZZZ的全部總數,那麼我需要排除,「ABC」之前的所有內容以及「AX」之後的所有內容。

所以現在的問題是,我該如何「ABC」之前和「AX」後發現計數。我查看了所有我的舊版離散和統計數學書,但沒有什麼適合的,或者在插入數字(n!/ n1!* n2!...)時給我正確的答案。我甚至試圖做一些轉換二進制或十六進制到十進制,但你知道這是一個史詩般的失敗=)。

謝謝,

戴夫

回答

0

的最簡單的解決方案是考慮兩個字符串爲數字在鹼-26表示:

ABC = 26^2 * 0 + 26^1 * 1 + 26^0 * 2 = 28(base 10) 
ACC = 26^2 * 0 + 26^1 * 2 + 26^0 * 2 = 54(base 10) 

ACC - ABC = 54 - 28 = 26 

因此,有在所述範圍內的總27串是[ABC, ACC]

的基本思想是使用positional numeral system與基部26(從A的所有字母 - Z)。

這種方法只有一個問題:
它不能處理空白字符,因爲它們不能遵循「默認」 - 行爲,因爲它們只能顯示爲前綴。

一種解決這一問題將是從

A = 0, B = 1, ..., Z = 25 

擴大值映射到

empty = -1, A = 0, ..., Z = 25 

雖然這打破了數字系統的定義,我們現在能夠處理較短的字符串也是如此:

magnitude([ZZ, AAA]) = AAA - ZZ + 1 = 0 - (-1) + 1 = 2 
+0

謝謝保羅,那正是我想要做的,但卻讓它倒退了。所以,如果我想添加數字0-9,那麼這個集合就是a-z0-9,我只會用你的前綴ABC = 36^2 * 0 + 36^1 * 1 + 36^0 * 2 – MaxThrust

+0

@MaxThrust。數字的基數等於可用字母表中的字符數。高興地幫助;) – Paul

+0

是東好,直到最後一部分。我得到AAA = 0,但不知道ZZ = -1。 ZZ的價值將是25,25,-1(空間),依次。 – MaxThrust

相關問題