C# 如何优化这个c代码?

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

我在编程平台上遇到了一个挑战(CodeWars-“查找除数”),我的算法似乎太慢了。 这是我从平台得到的错误:进程被终止。完成此操作需要12000ms以上的时间

这是挑战说明: 创建一个名为divisors/divisors的函数,该函数接受一个整数并返回一个包含该整数所有除数(1和数字本身除外)的数组。如果数字为prime,则返回字符串“(integer)为prime”(C#中为null)

公共静态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;
    }