如何优化此 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。所以:

  1. 你为什么要这样做两次?由于在复合 n 的情况下需要生成完整的因子列表,为什么不直接生成整个列表,然后根据列表的大小推断 n 是否为素数?

  2. 更重要的是,为什么 Divisors 中的 for 循环使用 n/2+1 作为上限,而 while 中的循环 [=11] =] 正确地观察到您真的只需要达到 √n?是的,复合 n 将具有大于 √n 的因子,但您无需在该点以上迭代即可找到它们,因为对于任何 k 均分 n,你知道n/k也能平分n.