如何优化此 c# 代码?
How to optimize this c# code?
我在编程平台 (CodeWars - "Find the divisors") 上遇到挑战,我的算法似乎太慢了。
这是我从平台得到的错误:进程被终止。完成时间超过 12000 毫秒
这是挑战说明:
创建一个名为 divisors/Divisors 的函数,它接受一个整数和 return 一个包含所有整数除数(除了 1 和数字本身)的数组。如果数字是素数 return 字符串“(整数)是素数”(C# 中为 null)
public static int[] Divisors(int n /* out int numfactors*/)
{
List<int> divArray = new List<int>();
int div;
if (isPrime(n))
{
return divArray.ToArray();
}
else
{
for (div = 2; div < n / 2 + 1; div++)
{
if (n % div == 0)
{
divArray.Add(div);
}
return divArray.ToArray();
}
}
}
public static bool isPrime(int n)
{
int d = 2;
if (n == 1 && n % 2 == 0 && n != 2) return false;
while (d * d <= n)
{
if (n % d == 0) return false;
d = d + 1;
}
return true;
}
我做错了什么,我该如何优化这个算法?如果我测试一个质数,我的代码 return "nothing" 这个我觉得是另外一个问题。
如果数字是质数,我正在尝试 return null 我的程序崩溃了:
"Object reference not set to an instance of an object"
在对您的问题的评论中,其他人已经注意到您的程序存在正确性问题,您需要在担心性能之前解决这些问题,这是千真万确的。但是,由于您询问了性能,请考虑 IsPrime
中的 while
循环和 Divisors
中的 for
循环本质上都在做同样的事情:遍历一组潜在因素并确定它们是否均分 n
。所以:
你为什么要这样做两次?由于在复合 n
的情况下需要生成完整的因子列表,为什么不直接生成整个列表,然后根据列表的大小推断 n
是否为素数?
更重要的是,为什么 Divisors
中的 for
循环使用 n/2+1
作为上限,而 while
中的循环 [=11] =] 正确地观察到您真的只需要达到 √n
?是的,复合 n
将具有大于 √n
的因子,但您无需在该点以上迭代即可找到它们,因为对于任何 k
均分 n
,你知道n/k
也能平分n
.
我在编程平台 (CodeWars - "Find the divisors") 上遇到挑战,我的算法似乎太慢了。 这是我从平台得到的错误:进程被终止。完成时间超过 12000 毫秒
这是挑战说明: 创建一个名为 divisors/Divisors 的函数,它接受一个整数和 return 一个包含所有整数除数(除了 1 和数字本身)的数组。如果数字是素数 return 字符串“(整数)是素数”(C# 中为 null)
public static int[] Divisors(int n /* out int numfactors*/)
{
List<int> divArray = new List<int>();
int div;
if (isPrime(n))
{
return divArray.ToArray();
}
else
{
for (div = 2; div < n / 2 + 1; div++)
{
if (n % div == 0)
{
divArray.Add(div);
}
return divArray.ToArray();
}
}
}
public static bool isPrime(int n)
{
int d = 2;
if (n == 1 && n % 2 == 0 && n != 2) return false;
while (d * d <= n)
{
if (n % d == 0) return false;
d = d + 1;
}
return true;
}
我做错了什么,我该如何优化这个算法?如果我测试一个质数,我的代码 return "nothing" 这个我觉得是另外一个问题。 如果数字是质数,我正在尝试 return null 我的程序崩溃了: "Object reference not set to an instance of an object"
在对您的问题的评论中,其他人已经注意到您的程序存在正确性问题,您需要在担心性能之前解决这些问题,这是千真万确的。但是,由于您询问了性能,请考虑 IsPrime
中的 while
循环和 Divisors
中的 for
循环本质上都在做同样的事情:遍历一组潜在因素并确定它们是否均分 n
。所以:
你为什么要这样做两次?由于在复合
n
的情况下需要生成完整的因子列表,为什么不直接生成整个列表,然后根据列表的大小推断n
是否为素数?更重要的是,为什么
Divisors
中的for
循环使用n/2+1
作为上限,而while
中的循环 [=11] =] 正确地观察到您真的只需要达到√n
?是的,复合n
将具有大于√n
的因子,但您无需在该点以上迭代即可找到它们,因为对于任何k
均分n
,你知道n/k
也能平分n
.