有人可以帮助纠正我的算法吗?我已经在一些数字上测试了它,并没有输出完整的因子分解。对于具有大量因素的数字,它只是完全失败。
int num = 20;
for(int i = 2; i <= num; i++)
{
if(num%i == 0)
{
cout << i << endl;
cout << num << endl;
num = num/i;
}
}
编辑:提供的两个答案不起作用,仍然没有得到完整的结果。
EDIT2:除数VS因子
答案 0 :(得分:12)
根据您对@ Luchian Grigore
的评论,您将除数与(素数)因子分解混淆。数字的除数是num % i == 0
为真的所有数字。分解意味着通过较小数字的乘积来表示num
。如果您想要分解的唯一性,通常使用素数分解。
要获得所有除数,您的代码应为
for ( int i = 1; i <= num; ++i ) // note that 1 and num are both trivially divisors of num
{
if ( num % i == 0 ) // only check for divisibility
{
std::cout << i << std::endl;
}
}
获得(素数)因子分解,它是
for ( int i = 2; i <= num; ++i )
{
while ( num % i == 0 ) // check for divisibility
{
num /= i;
std::cout << i << std::endl;
}
// at this point, i cannot be a divisor of the (possibly modified) num.
}
答案 1 :(得分:2)
问题在于,即使它是一个除数,你也在增加i
,除非你发现它的所有出现,否则你不应该这样做。
所以,对于4,你有两次。但是在你遇到的前2个之后,你退出循环,因为i
增加到3而num
变为2。
以下内容应该有效:
for(int i = 2; i <= num; )
{
if(num%i == 0)
{
cout << i << endl;
cout << num << endl;
num = num/i;
}
else
{
i++;
}
}
答案 2 :(得分:1)
for(int i = 2; i <= num; i++)
{
if(num%i == 0)
{
cout << i << endl;
cout << num << endl;
num = num/i;
i--; // Add this to account for multiple divisors
}
}
for(int i = 2; i <= num; i++)
{
if(num%i == 0)
{
cout << i << endl;
cout << num << endl;
}
}
答案 3 :(得分:0)
这应该有效。注意,应该使用c ++ 11作为移动构造函数,否则你将要传入一个std :: list&amp;代替。
std::list<int64_t> factor(int64_t f)
{
std::list<int64_t> factors;
for(int64_t ii = 2; ii<=f; ii++) {
while(f % ii == 0) {
f = f/ii;
factors.push_back(ii);
}
}
return factors;
}