2015-03-25 13 views
3

我有一個名爲LargeNum的類,它按陣列存儲大量數據,如digit[]。因爲int不足以存儲它。在C++中的兩個大號的Mod

的鹼10000,所以數'9876 8764 7263'被存儲,如:

digit[4] = {9876, 8764, 7263}; 

(基可改變成10100,像digit[12] = {9,8,7,6,8,7,6,4,7,2,6,3}

的問題是,我想重載操作者%,所以比我可以得到兩個大數的其餘部分。大數字之間的超載運算符*,-通過處理大數字的每個數字完成。但我真的不知道如何用%這樣做。像:

{1234,7890,1234} % {4567,0023} 

任何人都可以幫助我嗎?

+0

http://stackoverflow.com/a/2773953/213550相關 – VMAtm 2015-03-25 09:33:27

+0

該操作的結果本身可以(也應該)是'LargeNum'。你最好實現所有其他的算術運算符('+, - ,*,/'),然後你可以很容易地實現模運算符。你可能會發現[這個例子](https://github.com/barakman/Num)有用。 – 2015-03-25 14:49:06

+0

使用長分區。不管你怎麼做,實施師都是不愉快的。 :( – Hurkyl 2015-03-25 15:07:14

回答

0

的僞代碼應爲:

while digits_source > digits_base { 
    while first_digit_source > first_digit_base { 
     source -= base << (digits_source - digits_base) 
    } 

    second_digit_source += first_digit_source * LargeNum.base 
    first_digit_source = 0 
    digits_source-- 
} 

while (source >= base) { 
    source -= base 
} 

return source 

這應該採取的大量的「數字」的優勢。

編輯:爲簡單起見,我假設你的數組的單個數字可以包含(數字地說)兩個數字。如果不能,那麼代碼將變得相當棘手,因爲你不能做second_digit_source += first_digit_source * LargeNum.base


編輯:

關於一例操作(基地= 10000)

{65,0000,0099} % {32,0001} 

由於65是>32 ,然後繼續執行:

65 - 32 = 33 
0 - 1 = -1 

然後我們有{33, -1, 99} % {32, 1}。再繼續

33 - 32 = 1 
-1 - 1 = -2 

我們有{1, -2, 99} % {32, 1}。因爲32> 1,我們加入源的兩個第一個數字,我們有{1*1000 - 2, 99} % {32, 1}。現在我們可以進入簡單的while,只需執行減號操作即可。由於我們負擔不起負數,因此我們對source >= base進行了全面比較。然而,在算法的第一部分我們可以這樣做,因爲我們保證兩位數字的組合是正數。

+0

謝謝你的回答。例如,如果我想要做97283847283%2389238494;這些確切意味着什麼:在您的僞代碼中的digits_source,source等等。 – Johnn 2015-03-25 13:26:12

+0

在LongInt的第一個例子中,'9876 8764 7263',digits_source是3,源是'{9876,8764,7263}',first_digit_source是9876.你應該堅持一個簡單的例子,它會更容易迴應,而不是希望用不同的數據示例,讓我編輯整個過程的答案。 – MariusSiuram 2015-03-25 14:26:56

+0

哇,真酷!順便說一下,如果基於10的{2,-5}%{2,7},則{2,-5}較小,結果爲2 * 10-5。我測試了幾個簡單的數字,它解決了!我會稍後在程序中嘗試。對你表現出如此清晰的解釋非常好,這種思維方式非常出色! – Johnn 2015-03-25 15:19:27