2016-11-30 77 views
-2

我已經創建了一個程序,用於總結給定數據的所有可能的單個子字符串。例如: 1 1 2 2應返回30,因爲,如何總結不符合unsigned long long的大整數? C++

1 
1 + 1 
1 + 1 + 2 
1 + 1 + 2 + 2 
1 
1 + 2 
1 + 2 + 2 
2 
2 + 2 
2 

總計爲30,現在的問題是沒有建立這樣一個程序,這個問題是當大(10^15)號進來何時可以有多達10^5個。現在我的問題是:我如何處理這些數字?我只能使用標準庫,因此不幸的是我沒有使用GMP,而且我也被迫在GCC 4.4.4上運行,這使得它變得更糟。

+1

您需要分析至少粗略**將有多大你的結果是。例如,如果按照googool的順序,那麼所謂的「大整數」將無濟於事。 –

+0

我推薦使用GMP,因爲它不是標準C++庫的一部分。 –

+0

解決問題「我只能使用標準庫」而不是解決問題「我只有64位整數可用」。 – Hurkyl

回答

0

任何有興趣在回答我剛剛通過移動溢流數量分離unsigned long類型長整型想通了。

for(int i = 1; i <= n; i++){       
     SUM += addends[i - 1] * (i * (n - i + 1)); 

    if(SUM > 10000000000000000000){  // If close to overflow of unsigned long long int 
     SUM -= 10000000000000000000; // Remove 10^17 
     counter ++;      // And boost counter, to make recreating true value possible 
    } 
} 

可能真的很無效,但它對我的目的來說已經足夠了。感謝大家的幫助!

0

我認爲這將是很容易做到裸骨(只有你所需要的)實施UINT_128的。 (你最大的回答實際上適合在uint_96)

假設我知道你要執行程序的方式,所有你需要的是構造函數,採取uint64_t中;加法運算符;乘法運算符;並可能是一個顯示器。

我會在內部存儲它作爲4 uint32_t的(字)和操作可以通過只是以同樣的方式增加或長乘法是由手工完成的小數的話操作來實現。乘法可以簡化,因爲我相信你的因素永遠不會超過uint64_t,所以你可以利用它。

如果您需要顯示二進制或十六進制以外的內容,那麼您可能還需要實現分割(或者如果您真的很懶,可以用數字二進制搜索風格猜測得出結果並僅使用乘法來檢查以獲得十進制表示)。