我写过这个c程序。这很好用。我想要的是非常大的值,如1000000.这应该在不到1秒的时间内运行。
该程序生成n> 1的序列。 a [0] = a [1] = 0且a [n] = a [n-1] + f(n),其中f(n)是n的最小素数因子。
#include<stdio.h>
int fn(long no)
{
long i;
for (i = 2; i <= no; i++)
{
if (no % i==0)
{
return i;
break;
}
}
}
int main(void)
{
int t,i;
long n,a1,j;
scanf("%d",&t);
for(i=0;i<t;i++)
{
a1=0;
scanf("%ld",&n);
for(j=2;j<=n;j++)
{
a1 = a1 + fn(j);
}
printf("%d\n",a1);
}
}
答案 0 :(得分:2)
您只需修改如下内容即可看到很大的不同:
#include<math.h>
int fn(long no)
{
long i;
int sqrtno= (int)sqrt((double)no);
for (i = 2; i <= sqrtno; i++)
{
if (no % i==0)
{
return i;
}
}
return no;
}
当你达到no
的平方根时,没有必要继续搜索除数,因为当除数大于此值时,另一个除数更小。
答案 1 :(得分:0)
该程序在[2,n]范围内找到最小素因子的总和。
您可以设置n个元素的int数组,将其初始化为0.然后,使用Sieve of Eratosthenes算法标记每个素数的倍数。当数字i是素数x的倍数时,检查它是否已被标记为关闭,如果没有,则将x存储到元素[i]中。
然后,对数组中的所有数字求和。
答案 2 :(得分:0)
如果它足够快,但不完全,请记住素数只能是以1,3,7,9结尾的数字。因此,如果它在5结束时,j可以上升到2并且不会下降。这应该会立即给你60%的提升。
答案 3 :(得分:0)
问题是循环:
for (i = 2; i <= no; i++)
应该是
for (i = 2; i * i <= no; i++)
然后在返回后删除中断,并添加:
return no;
在函数结束时,循环完成后。
<强>说明:强> 您不需要检查2和n之间的所有可能因素。如果你找不到2和sqrt(n)之间的任何因子,则n是素数,它是你要找的数字。