我需要一个最优算法来找到数字N的最大除数.最好是在C++或C#中

Ron*_*zii 9 c# c++ algorithm

我目前正在使用以下代码,但它对于大数字来说非常慢



        static int divisor(int number)
        {
            int i;
            for (i = number / 2; i >= 1; i--)
            {
                if (number % i == 0)
                {
                    break;
                }
            }
            return i;
        }
Run Code Online (Sandbox Code Playgroud)

Vla*_*mir 22

首先想到你可以找到最小的除数d(当然不等于1),那么N/d将是你正在寻找的最大除数.

例如,如果N可以被3整除,那么你将需要2次迭代来找到答案 - 在你的情况下,它将是大约N/6次迭代.

编辑:为了进一步改进你的算法,你可以只迭代奇数(在检查你的数字是否为偶数之后),或者更好的是,如果你有预先计算的素数列表,那么你可以迭代它们只是因为最小的除数很明显是素数.

  • @davka,大致可以证明:让p是N的最小除数,然后从1搜索的迭代次数约为p/2(当我们只检查奇数时),从N/2数字搜索是N/2 -N/p.第一种方法更差的情况意味着p/2> N/2-N/p相当于p*p /(p-2)> n - 并且只有当n = p时才可能,即n时是素数 (3认同)
  • 考虑小除数更密集这一事实的最简单方法是,如果两个数(A,B)相乘得到目标数(N),那么如果我们假设A> B,那么我们就知道最小可能的A和最大可能的B是sqrt(N).因为对于每个A,存在唯一的B(忽略A = B = sqrt(N)),因此我们具有相同数量的A和B的可能性.显然,尽管范围1到sqrt(N)小于sqrt( N)到N(乘以sqrt(N)-1)因此你最好在较低范围内搜索而不是上部. (3认同)

Sco*_*gan 5

不知道这是否是最佳解决方案,但您最好从2开始,然后向上攀升,例如:

  static int divisor(int number)
    {
        int i;
        for (i = 2; i <sqrt(number); i++)
        {
            if (number % i == 0)
            {
                break;
            }
        }
        return number/i;
    }
Run Code Online (Sandbox Code Playgroud)

编辑

使它也能与质数一起使用:

 static int divisor(int number)
    {
        int i;
        for (i = 2; i <=sqrt(number); i++)
        {
            if (number % i == 0)
            {
                return number/i;
            }
        }
        return 1;
    }
Run Code Online (Sandbox Code Playgroud)

  • @Bunnit:上面的代码不会产生正确的结果 (2认同)
  • 不要迟钝,@bjsk,_specify_ 在什么条件下它不起作用。 (2认同)