【问题标题】:How to optimize this c# code? [closed]如何优化此 c# 代码? [关闭]
【发布时间】:2017-11-08 22:35:45
【问题描述】:

我在编程平台上遇到了挑战(CodeWars - “查找除数”),我的算法似乎太慢了。 这是我从平台得到的错误:进程已终止。完成时间超过 12000 毫秒

这是挑战说明: 创建一个名为 divisors/Divisors 的函数,它接受一个整数并返回一个包含所有整数除数的数组(除了 1 和数字本身)。如果数字是素数,则返回字符串 '(integer) is prime'(在 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 null 我的程序因以下原因而崩溃: “对象引用未设置为对象的实例”

【问题讨论】:

  • 由于您的代码不会产生正确的结果,因此可以对其进行优化以始终返回相同的值,从而继续当前的行为。如果这还不够,您需要使用可靠的minimal reproducible example 将问题缩小到单个问题。
  • @therapt cr 不是非工作代码的正确位置。
  • 挑战不希望您计算数字是否为素数 - 它希望您计算并返回所有正除数(除了 1 和数字本身)。只有当没有(因此它是素数)时才返回“n 是素数”。
  • for...循环内的返回似乎是完全错误的。我很想看看这个sn-p的main
  • 不要在代码战上作弊!

标签: c# arrays primes object-reference


【解决方案1】:

在关于您的问题的 cmets 中,其他人指出您的程序存在正确性问题,您需要在担心性能之前解决这些问题,这绝对是正确的。但是,既然您询问了性能,请考虑IsPrime 中的while 循环和Divisors 中的for 循环本质上都在做同样的事情:遍历一组潜在因素并确定它们是否均匀划分n。所以:

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

    李>
  2. 更重要的是,为什么Divisors 中的for 循环使用n/2+1 作为其上限,而IsPrime 中的while 循环正确地观察到您只需要上升到@ 987654333@?是的,复合 n 将具有大于 √n 的因子,但您无需在该点之上迭代即可找到它们,因为对于任何均匀除以 nk,您知道 @ 987654338@也平分n

【讨论】:

  • 谢谢@joefarrel。现在我意识到我错了,我不明白确切的要求。
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多