【发布时间】:2013-12-25 08:26:31
【问题描述】:
我正在尝试编写一个函数,该函数将返回给定数字的素数分解(作为解决项目欧拉问题 #12 的一部分)。计算主要因素。我使用std::map。
代码如下:
#include "stdafx.h"
#include <iostream>
#include <map>
#include <algorithm>
bool IsPrime(unsigned int number)
{
if (number < 1) return 0; // zero is not prime. For our purposes, one would be.
for (unsigned int i = 2; i*i <= number; ++i)
{
if (number % i == 0)
return false;
}
return true;
}
int divisors(unsigned int num)
{
int orig_num = num;
std::map <int, int> primefactors;
for(unsigned int i = 1; i <= num; ++i)
if (num % i == 0 && IsPrime(i))
{
num /= i;
++primefactors[i];
std::cout << primefactors[i] << "\t";
}
std::cout << orig_num << " = ";
for(auto& iter:primefactors)
std::cout << iter.first << "^" << iter.second << " * ";
return 0;
}
int main()
{
divisors(661500);
return 0;
}
问题是primefactors 的所有计数都返回为 1,尽管main 中的数字被专门选择为大于 1 次幂的素数乘积 (661500 = 1^1*2^2 *3^3*5^3*7^2)。
我的猜测是我增加了一些错误。
【问题讨论】:
-
if (num % i == 0 && IsPrime(i))应该是if (IsPrime(i)) while (num % i == 0) -
@AntonKovalenko,为什么?