C# 如何优化这个c代码?
我在编程平台上遇到了一个挑战(CodeWars-“查找除数”),我的算法似乎太慢了。 这是我从平台得到的错误:进程被终止。完成此操作需要12000ms以上的时间 这是挑战说明: 创建一个名为divisors/divisors的函数,该函数接受一个整数并返回一个包含该整数所有除数(1和数字本身除外)的数组。如果数字为prime,则返回字符串“(integer)为prime”(C#中为null)C# 如何优化这个c代码?,c#,arrays,primes,object-reference,C#,Arrays,Primes,Object Reference,我在编程平台上遇到了一个挑战(CodeWars-“查找除数”),我的算法似乎太慢了。 这是我从平台得到的错误:进程被终止。完成此操作需要12000ms以上的时间 这是挑战说明: 创建一个名为divisors/divisors的函数,该函数接受一个整数并返回一个包含该整数所有除数(1和数字本身除外)的数组。如果数字为prime,则返回字符串“(integer)为prime”(C#中为null) 公共静态int[]除数(int n/*out int numfactors*/) { List divA
公共静态int[]除数(int n/*out int numfactors*/)
{
List divArray=new List();
国际部;
if(isPrime(n))
{
返回divArray.ToArray();
}
其他的
{
对于(div=2;div 虽然(D*D<P>)在你的问题的评论中,其他人已经注意到你的程序在你担心性能之前需要处理正确的问题,这是绝对正确的。但是,既然你问了性能,那么考虑<代码> <<代码>循环>代码> ISPrime<代码>,< <代码> >循环> <代码>除数。
两者的作用本质上是相同的:迭代一组潜在因素,并确定它们是否平均分配n
。因此:
n
的情况下需要生成一个完整的因子列表,为什么不先生成整个列表,然后根据列表的大小推断n
是否为素数除数中的for
循环使用n/2+1
作为其上限,而IsPrime中的循环正确地观察到您只需要进入√n
?是的,复合n
的因子大于√n
,但您不需要在该点上迭代来找到它们,因为对于任何均匀划分n
的k
,您知道n/k
也均匀划分n
由于您的代码不能生成正确的结果,因此可以对其进行优化,以始终返回相同的值,从而继续当前的行为。如果这还不够,您需要使用solid将问题范围缩小到单个proble。@therapt cr不是非工作代码的正确位置。挑战不希望您计算该数字是否为素数-it希望您计算并返回所有正因子(除了1和数字本身)。只有当没有正因子时(因此它是素数),才返回“n是素数”.for…循环中的返回似乎是完全错误的。我很好奇看到这段代码的主要部分不要在codewars上作弊!谢谢@joefarrel。现在我意识到我的错误,我不理解确切的要求。
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;
}