我做了这个函数来计算从用户获得的数字(n)的素数因子分解。我遇到了问题,因为它不会多次打印相同的因素。
例如:
3960的Prime Factorization是:
11 5 3 3 2 2 2
但是我的程序只打印出来:
11 5 3 2
任何人都可以帮我确定原因并帮助我找到解决方案吗?
void primefact(int n)
{
Stack f;
assert(n >= 0);
bool prime;
for(int d = 2; d <= n; d++) // Test for factors > 1
{
if(n % d == 0)
{
prime = true;
for(int j = 2; j < d; j++) // Test for prime
{
if(d % j == 0) // It is not prime
prime = false;
}
if(prime)
f.push(d);
}
}
while(!f.empty())
{
cout << f.top() << endl;
f.pop();
}
}
答案 0 :(得分:1)
只要分割输入,就必须循环遍历相同的素数。
答案 1 :(得分:0)
任何人都可以帮我确定原因吗?
您正在检查n
是否可以被d
整除,但随后您将继续使用下一个值。如果n
可被d
整除且d
为素数,则您需要实际将n
除以d
并再次检查d
。
我们以12为例。素数因子为[3, 2, 2]
。您的代码执行此操作:
n = 12, d = 2
n % d == 0? Yes. Push d. d = d + 1
n % d == 0? Yes. Push d. d = d + 1
n % d == 0? No. d = d + 1
n % d == 0? No. d = d + 1
n % d == 0? No. d = d + 1
n % d == 0? No. d = d + 1
// and so on until d == n
您需要执行此操作的代码:
n = 12, d = 2
n % d == 0? Yes. Push d. n = n/d // n is 6, d is 2
n % d == 0? Yes. Push d. n = n/d // n is 3, d is 2
n % d == 0? No. d = d + 1 // n is 3, d is 3
n % d == 0? Yes. Push d. n = n/d // n is 1 so you're done
答案 2 :(得分:0)
您可能知道自己的算法远非最佳。所以这不会对表现造成太大影响。取代
if(prime)
f.push(d);
与
if (prime)
{
for (int d1 = d; n % d1 == 0; d1 *= d)
f.push(d);
}
答案 3 :(得分:-1)
素数分解的最简单代码: -
for ( int i = 2; i <= num; ++i )
{
while ( num % i == 0 )
{
num /= i;
std::cout << i << std::endl;
}
}