在学校,我们制作了一个程序,查找给定范围内所有数字的除数,例如,所有5位数字。我们用一个像
这样粗略的算法来做到这一点for i:=1 to n do begin
for j:=1 to i do begin
if (i mod j=0) then Inc(counter);
end;
*writing the counter somewhere*
end;
需要n(n+1)/2
次迭代(如果我没有弄错的话) - 那是O(n^2)
吗?当在6位数的范围内使用时,看到这种情况持续了7分钟到没有结束,我试图改进它。我改变它,以便第二个循环只到i
数字的平方根,如下所示:
for i:=1 to n do begin
for j:=1 to Trunc(sqrt(n)) do begin
if (i mod j=0) then begin
Inc(counter);
if (i/j)>0 then Inc(counter);
end;
end;
*writing the counter somewhere*
end;
我无法找到Delphi的floor函数,因此Trunc
- 它与自然数相同。现在,该算法需要floor(sqrt(1))+floor(sqrt(2))+...+floor(sqrt(n))
次迭代(我不知道如何在此处插入sigma sum表示法)。有没有办法在没有求和的情况下写出这个,或者更确切地说,用O()
符号?
此外,还有更好的算法吗?我不是要求完整的代码,而是要搜索的内容。