C# 我的程序执行时间是否太长?

C# 我的程序执行时间是否太长?,c#,.net,algorithm,C#,.net,Algorithm,我想解决Euler项目提出的一个问题,关于寻找一个大数中的最大素数。我在Visual studio 2012的虚拟机上运行代码,代码似乎冻结了。当我进入循环时,代码运行良好,但当我执行它时,控制台总是在那里。就好像程序还在运行。可能是程序执行需要时间吗 我的代码 static void Main(string[] args) { long number = 5; for (long i = 1; i < 600851475143; i++) { i

我想解决Euler项目提出的一个问题,关于寻找一个大数中的最大素数。我在Visual studio 2012的虚拟机上运行代码,代码似乎冻结了。当我进入循环时,代码运行良好,但当我执行它时,控制台总是在那里。就好像程序还在运行。可能是程序执行需要时间吗

我的代码

static void Main(string[] args)
{
    long number = 5;

    for (long i = 1; i < 600851475143; i++)
    {
        if (i % 2 != 0 && i % 1 == 0 && i % i == 0)
            number = i;
    }

}
static void Main(字符串[]args)
{
长数=5;
用于(长i=1;i<600851475143;i++)
{
如果(i%2!=0&&i%1==0&&i%i==0)
数字=i;
}
}

归根结底,如果代码不能正常工作,那么你是否能写出世界上最快的代码并不重要。你的没有,速度放在一边。

我运行了这段代码,它确实需要一段时间才能运行,但它似乎确实在进步(我确实在增加)。尝试此操作以确定我是否为素数:

    public static bool IsPrime(long candidate)
    {
        // Test whether the parameter is a prime number.
        if ((candidate & 1) == 0)
        {
            return candidate == 2;
        }
        // Note:
        // ... This version was changed to test the square.
        // ... Original version tested against the square root.
        // ... Also we exclude 1 at the very end.
        for (int i = 3; (i * i) <= candidate; i += 2)
        {
            if ((candidate % i) == 0)
            {
                return false;
            }
        }
        return candidate != 1;
    }
公共静态bool IsPrime(长候选)
{
//测试参数是否为素数。
如果((候选者&1)==0)
{
返回候选者==2;
}
//注:
//…此版本已更改为测试方形。
//…根据平方根测试原始版本。
//…最后我们排除了1个。

对于(int i=3;(i*i)您的算法不正确。下面是一个简单的方法,可以找到适合Project Euler的复合数的素因子:

function factors(n)
    f := 2
    while f * f <= n
        if n % f == 0
            output f
            n := n / f
        else
            f := f + 1
    output n
功能因子(n)
f:=2

而我认为你回答了你自己的问题question@Hardrada我明白你的意思,但是,这个代码太小了。这怎么可能呢?
while(1)
很小,但它可以永远运行。代码长度与执行时间几乎没有关系。你的代码根本不测试素数……我甚至无法想象你会怎么想。素数是一个只能被自身和1整除的数字(所有数字都是1)。你的最后两个测试毫无意义;你的第一个测试是检查偶数(它们从来都不是素数)你的循环运行了6000亿次。一个用于边界测试的操作。两个用于条件的第一部分。我们最多执行1.8万亿次操作。另外两个用于执行一半时间的第二部分。我们最多执行2.4万亿次。第三部分永远不会执行。我强烈怀疑这些操作中的大多数编译到多个机器指令但是,即使他们不这样做,在最快的PC处理器上,也至少需要700秒。更糟糕的是,第一个条件是50:50,这意味着分支预测器严重失败,而且速度要慢得多。有几件事,1)你正在做的测试根本不是为了测试素数2)
i%1==0&&i%i==0
总是正确的,为什么会有它?你的代码真正做的就是通过测试前面的每个数字来找到最大的偶数。
i%2!=0
为偶数!
function factors(n)
    f := 2
    while f * f <= n
        if n % f == 0
            output f
            n := n / f
        else
            f := f + 1
    output n