我正在尝试生成数字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;
}
答案 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