查找给定数字因子的算法..最短方法?

时间:2010-05-16 17:25:23

标签: c algorithm

找出给定数字的因子可能是最简单和最有效的逻辑。 是否存在基于相同的算法。

实际上,我真正的问题是找出答案。对于给定数字存在的因素..

所以任何算法,请告诉我这个..

感谢。

6 个答案:

答案 0 :(得分:19)

  

实际上,我真正的问题是找出答案。对于给定数字存在的因素..

嗯,这是不同的。让n为给定数字。

如果n = p1^e1 * p2^e2 * ... * pk^ek,其中每个p是素数,则n的因子数为(e1 + 1)*(e2 + 1)* ... *(ek + 1)。有关here的更多信息。

因此,足以找到每个素因子出现的权力。例如:

read given number in n
initial_n = n
num_factors = 1;
for (i = 2; i * i <= initial_n; ++i) // for each number i up until the square root of the given number
{
    power = 0; // suppose the power i appears at is 0
    while (n % i == 0) // while we can divide n by i
    {
        n = n / i // divide it, thus ensuring we'll only check prime factors
        ++power // increase the power i appears at
    }
    num_factors = num_factors * (power + 1) // apply the formula
}

if (n > 1) // will happen for example for 14 = 2 * 7
{
    num_factors = num_factors * 2 // n is prime, and its power can only be 1, so multiply the number of factors by 2
}

例如,取1818 = 2^1 * 3*2 => number of factors = (1 + 1)*(2 + 1) = 6。实际上,6的{​​{1}}因素是18

这是我的方法与@Maciej描述和发布的方法之间的一个小基准。他的优势在于更容易实现,而如果改变只是遍历素数,我的优势就是更快,正如我为此测试所做的那样:

1, 2, 3, 6, 9, 18

我的机器上的结果:

  

测试等效性...
  确认等效!
  时间IVlad ...
  总毫秒:2448
  时间Maciej ...
  总毫秒数:3951
  按任意键继续 。 。 。

答案 1 :(得分:4)

有大量可用的算法 - 从简单的试验分割到非常复杂的大数算法。查看维基百科上的Integer Factorization并选择一个符合您需求的文件。

这是一个简短但效率低下的C#实现,它可以找到素数因子的数量。如果你需要多个因子(不是素数因子),你必须用它们的多样性存储素数因子,然后计算因子的数量。

var number = 3 * 3 * 5 * 7 * 11 * 11;

var numberFactors = 0;
var currentFactor = 2;

while (number > 1)
{
    if (number % currentFactor == 0)
    {
        number /= currentFactor;
        numberFactors++;
    }
    else
    {
        currentFactor++;
    }
}

答案 2 :(得分:1)

您可以查看this algorithm

答案 3 :(得分:1)

以下是我与| / | ad:)的简短讨论的成果。

read given number in n
int divisorsCount = 1;
int i;
for(i = 2; i * i < n; ++i)
{
    if(n % i == 0)
    {
        ++divisorsCount;
    }
}
divisorsCount *= 2;
if(i * i == n)
{
    ++divisorsCount;
}

答案 4 :(得分:0)

小心,对于单个n值,这个答案没有用/快。

方法1

如果您维护一个查找表(对于数字的第一个素数因子),您可以在O(polylog(n))中获取它。

如果gcd(a,b)== 1,那么 没有。因子a * b =(a的因子数)*(b的因子数)

因此,对于给定数字a * b,如果gcd(a,b)!= 1,那么我们可以有两个其他数字p和q,其中p = a和q = b / gcd(a,b)。因此,gcd(p,q)== 1.现在,我们可以递归地找到p和q的因子数。

只需要做一些小的努力就可以确保p和q都不是1。

P.S。当您需要知道从1到n的所有数字的因子数时,此方法也很有用。它将是O的顺序(nlogn + O(查找表))。

方法2 :(我对此没有所有权。)

如果您要查找第一个素数因子直到n,那么您可以知道它在O(logn)中的所有主要因子,从而找到它们中的因子数。

P.S。谷歌在登录中的分解&#39;为了更好的解释。

答案 5 :(得分:-4)

Euclid算法应该足够了。