繁体   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