-4

我想让下面的代码快速。运行需要很长时间,我收到此错误:

警告: FOR 循环索引太大。截断为 2147483647。

我需要计算超过 3^100 所以......这不可能吗?

function sodiv = divisorSum(n)
    sodiv = 0;
    for i=1:n
        if (mod(n,i) == 0)
            sodiv = sodiv + i;
        end
    end
end

function finalSum1 = formular1(N,n)
    finalSum1 = 0;
    for k = 1:N
       finalSum1 = finalSum1 + (divisorSum(k) * divisorSum(3^n*(N-k)));
    end
end

Nv=100;
nv=[1:20];

for i=1:length(nv)
    tic;
    nfunc1(i)=formular1(Nv,nv(i));
    nt1(i)=toc;
    sprintf('nt1 : %d finished, %f', i,nt1(i))
end

这段代码的目的是检查算法的计算时间。

4

2 回答 2

4

对于这个特定问题,该算法过于笼统且效率低下。

我知道您想将 3^100 的除数相加。但是这些除数很容易确定。

S = 1 + 3 + 3^2 + 3^3 + ... + 3^100,一个几何级数。

3*S = 3 + 3^2 + ... + 3^101

减去

2*S = 3^101 - 1

S = (3^101 - 1)/2

于 2012-08-06T06:32:56.603 回答
3

这段代码永远不会完成,因为它效率很低。

例如,有一个函数可以计算所有除数的数量,并遍历从 1 到 N 的所有数字并进行计数。但是使用有效的公式会使它运行得更加熟练。

假设需要对数的除数求和,a^b其中a是素数。而不是计算 a^b 和 go form 1 to a^b,可以看到它更好 go a^1, a^2, a^3, ..., a^n,因为只有这些数字是除数。但你可以更进一步,观察到这些数字的总和是几何级数的总和,因此除数的数量变为:

和除数, a^b = (a^(b+1)-1) / (a-1)

于 2012-08-06T06:40:26.937 回答