项目Euler 3在c中,对于大数字代码处理时间过长?

时间:2014-04-07 07:20:21

标签: c unsigned-long-long-int

给予答案是永远的,似乎只是在处理答案?我见过类似的问题,但请告诉我这段代码有什么问题?

#include<stdio.h>
main()
{
    int flag=0;
    unsigned long long int j,z,ino,i;
    scanf("%llu",&ino);
    for(i=2;i<=ino/2;i++)
    {
        flag=0; 
        if(ino%i==0)
        {
            for(j=2;j<=i/2;j++)
            {
                if(i%j==0)
                {
                    flag=1;
                }
            }

            if(flag==0)
            {
                z=i;
            }
        }
    }

printf("%llu",z);
}

问题在于:

  

13195的主要因素是5,7,13和29.最大的是什么   数字的主要因素600851475143?

1 个答案:

答案 0 :(得分:0)

这不是代码错误,因为错误,错误是低效的。

让我们看看你的代码,它测试一个数字是否为素数:

            for(j=2;j<=i/2;j++)
            {
                if(i%j==0)
                {
                    flag=1;
                }
            }

如果你正在测试数字7919(这是素数)的主要部分,你的循环将运行近4,000次。

但你的病情会更强烈。如果你写了:

        for(j=2;j<=sqrt(i);j++)
        {
            if(i%j==0)
            {
                flag=1;
            }
        }

那么你的素数测试仍然是正确的 - 但它只需要运行88次,这是一项巨大的改进。渐渐地,你已经从用于测试素数的线性(in n)算法变为在root n时间运行的算法 - 你可以更快地测试素数,但是你不必至少在前50个项目欧拉的问题。

我的这个项目的代码版本Euler问题远不是你的问题,除了素数检查(以及它在Java中),它运行在0.023631秒。