找出C中的素因子

时间:2011-03-12 20:34:13

标签: c primes

我正在尝试生成数字n的所有素因子。当我给它编号126时,它给了我2,3和7但是当我说它8时,它给了我2,4和8.任何关于我做错的想法?

int findPrime(unsigned long n)
{
  int testDivisor, i;
  i = 0;
  testDivisor = 2;
  while (testDivisor < n + 1)
  {
    if ((testDivisor * testDivisor) > n)
    {
    //If the test divisor squared is greater than the current n, then 
    //the current n is either 1 or prime. Save it if prime and return
    }
    if (((n % testDivisor) == 0))
    {
      prime[i] = testDivisor;
      if (DEBUG == 1) printf("prime[%d] = %d\n", i, prime[i]);
      i++;
      n = n / testDivisor;
    }
    testDivisor++;
  }
  return i;
}

4 个答案:

答案 0 :(得分:3)

即使您可以将testDivisor除以n,也会递增2,2,2。只有在它不再可分割时才增加它。这将导致{{1}},所以你必须进一步修改它,这样你就不会存储重复项,但由于这是一项家庭作业,我认为你应该自己想出一个:)

答案 1 :(得分:2)

这是基于您的教授告诉您实施的算法还是您自己的启发式算法?如果有帮助,一些已知的素数分解算法是二次筛和通用数字筛。

答案 2 :(得分:0)

现在,你没有检查你找到的任何除数是否为素数。只要n % testDivisor == 0您将testDivisor视为主要因素。此外,您只需按testDivisor一次。您可以通过多种方式解决此问题,其中一种方法是将if (((n % testDivisor) == 0))替换为while (((n % testDivisor) == 0))

通过添加while循环来修复此问题也可以确保您不会将复合数字作为除数,就好像它们仍然除以n一样,较小的素因子也必须除以n和while这个素因子的循环不会提前离开。

答案 3 :(得分:0)

以下是查找Prime因子的代码:

long GetPrimeFactors(long num, long *arrResult)
{
    long count = 0;
    long arr[MAX_SIZE];

    long i = 0;

    long idx = 0;

    for(i = 2; i <= num; i++)
    {
      if(IsPrimeNumber(i) == true)
          arr[count++] = i;
    }

    while(1)
    {
      if(IsPrimeNumber(num) == true)
      {
          arrResult[idx++] = num;
          break;
      }
      for(i = count - 1; i >= 0; i--)
      {
          if( (num % arr[i]) == 0)
          {
            arrResult[idx++] = arr[i];
            num = num / arr[i];
            break;
          }
      }
    }
    return idx;
}

参考:http://www.softwareandfinance.com/Turbo_C/Prime_Factor.html