优化此代码,使代码在不到1秒的时间内运行

时间:2014-05-28 06:27:44

标签: c performance optimization

我写过这个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);
    }
}

4 个答案:

答案 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是素数,它是你要找的数字。