簡體   English   中英

大量非常大的數字求和的算法(C ++)

[英]Algorithm for summing large number of very large numbers (C++)

我正在嘗試解決問題13 @ Project Euler,並且我正在尋找一種很好的算法來進行加法運算並輸出非常大的數字的答案。 首先,我將數字轉換成矩陣(100 x 50)的元素。 這是我想出的算法:

unsigned long long int sum=0, carry_over=0;
for(int j=49; j>=0; j--)
{
    for(int i=0; i<100; i++)
        sum+=num[i][j];
    sum+=carry_over;
    carry_over=sum/10;
    cout<<sum%10;
    sum=0;
}
cout<<carry_over;  

現在,輸出將具有反轉的數字,從單位位數開始,到總和的第一個數字結束。 可以很容易地手動將其反轉。

考慮到准確性和速度,我想知道這是否是一個好的算法。 請提出更正建議以改善它。

您的算法已經是最佳的。

您的算法的時間復雜度為O(m*n) ,其中m是每個數字的位數(50), n是數字的位數(100),這就是輸入中的位數。 很容易看出,您必須讀取輸入中的所有數字才能輸出正確的答案,因此您必須至少讀取m*n數字, 讀取時的時間復雜度為O(m*n)輸入。 因此,算法的時間復雜度不能小於該時間復雜度,因此您的O(m*n)算法是最佳的。

如果以某種方式,您已經將輸入數據存儲在RAM中(並且采用了適當的格式),則可以考慮進行其他一些優化。

考慮地址大小:

現代計算機的地址大小為32位或64位,這意味着它們可以在一次操作中對32位或64位進行加法運算。 64位大約是18個十進制數字,因此只需要3個64位整數即可存儲每個整數,因此加法的時間復雜度將從m=50降低到m=3 ,使求和的數量級提高快點。

考慮並行處理:

現代計算機可以並行運行多個線程。 這個問題的解決方案很容易並行化。 如果您的計算機能夠同時運行2個線程,則可以使用第一個線程對前50個數字求和,而使用第二個線程對后50個數字求和。 兩次求和完成之后(如果所有事情都是在單個線程上計算的,則大約需要一半的時間),您只需對兩個子結果求和。

暫無
暫無

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

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