有没有办法找到给定整数的质因子数?

Posted

技术标签:

【中文标题】有没有办法找到给定整数的质因子数?【英文标题】:Is there a way to find the number of prime factors of a given integer? 【发布时间】:2017-12-20 00:15:54 【问题描述】:

我正在尝试实现一个函数来分解一个数字,到目前为止我有这个代码:

int * factor(int n) 
  int * vet;
  //
  int p = 2;
  int index = 0;
  while(n > 1) 
    while(n % p != 0) 
      p++;
      index++;
    
    n = n / p;
    vet[index]++;
  
  return vet;

这个函数应该返回一个数组,其中包含数字n 的每个素数的幂。像这样:

如果 1200 = 2x2x2x2x3x5x5,则 1200 = 2^4 + 3^1 + 5^1,因此如果参数为 1200,则函数应返回数组 4,1,0,3。

如果 440 = 2x2x2x5x11,则 440 = x^3 + 5^1 + 11^1,该函数应返回数组 3,0,0,1,0,0,0,0,0, 1

我的问题是在我开始分解过程之前是否存在某种方法来确定vet 的大小,在while 循环中。

另外,使用这个结果数组(或上面概念的一些变体),是否有可能找到这个数字的 2 的幂?例如:

440 = 1x2^8 + 1x2^7 + 0x2^6 + 1x2^5 + 1x2^4 + 1x2^3 + 0x2^2 + 0x2^1 + 0x2^0 产生数组 1,1,0,1,1,1,0,0,0

1200 = 1x2^10 + 0x2^9 + 0x2^8 + 1x2^7 + 0x2^6 + 1x2^5 + 1x2^4 + 0x2^3 + 0x2^2 + 0x2^1 + 0x2^0 产生数组 1,0,0,1,0,1,1,0,0,0,0

【问题讨论】:

首先,vet 是一个未初始化的变量,您的代码通过访问它会表现出未定义的行为。 如果您的代码有具体问题,请提供minimal reproducible example 进行演示。如果您没有具体问题,那么您希望得到什么样的答案? *** 不是免费的代码编写服务。如果这是一个家庭作业,你可能会发现这个很有趣meta.***.com/questions/334822/… std::vector<int> vet;。现在你的问题少了。 @IgorTandetnik 但是如果我不能在这里使用std:vetor,问题仍然存在;真的不可能为此分配一个数组,找到一个长度值吗? 【参考方案1】:

一个最快的简单解决方案:

void getFactors(int n)

    while (n%2 == 0)
    
        n = n/2;
    

    for (int i = 3; i * i <= n; i = i+2)
    
        // While i divides n, print i and divide n
        while (n%i == 0)
          
            std::cout<<i<<std::endl;
            n = n/i;
        
    


【讨论】:

以上是关于有没有办法找到给定整数的质因子数?的主要内容,如果未能解决你的问题,请参考以下文章

算法---分解质因数

输入一个正整数,按照从小到大的顺序输出它的所有质因子(如180的质因子为2 2 3 3 5 )

[CQOI2016]伪光滑数

GCD (区间数的质因子打表+容斥原理)

hdu-2421 Deciphering Password 数学姿势

容斥原理——poj1091