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