我想快速制作下面的代码。运行需要很长时间,我收到了这个错误:
警告: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
此代码的目的是检查算法的计算时间。
答案 0 :(得分: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
答案 1 :(得分:3)
这段代码永远不会完成,因为它效率很低。
例如,有一个函数可以计算所有除数的数量,并且正在经历从1到N的所有数字并计数。但是使用有效的公式会让它变得更加掌握。
假设需要求数a^b
的除数,其中a
是素数。
人们可以看到它更好,而不是计算^ b和格式1 to a^b
a^1, a^2, a^3, ..., a^n
,因为只有这些数字才是除数。但你可以更进一步观察这些数字的总和为the sum of geometric progression,因此除数的数量变为:
和除数a^b = (a^(b+1)-1) / (a-1)