#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
//判断是否为质数
bool isPrime(long num)
{
//两个较小数另外处理
if(num == 2 || num == 3)
return 1 ;
//不在6的倍数两侧的一定不是质数
if(num % 6 != 1 && num % 6 != 5)
return 0 ;
long tmp = long(sqrt(num));
//在6的倍数两侧的也可能不是质数
for(long i = 5;i <= tmp; i += 6)
if(num % i == 0 || num % (i + 2) == 0)
return 0 ;
//排除所有,剩余的是质数
return 1 ;
}
//寻找当前最小质因数
long min_yinshu(long shu){
for(long i = 2; i <= shu; i++)
if(shu % i == 0 && isPrime(i))
return i;
return -1;
}
//Pollard Rho因数分解
int main() {
long number;
cin >> number;
vector<long> yinshis;
long yinshu;
while(1){
yinshu = min_yinshu(number);
if(yinshu == number){
yinshis.push_back(yinshu);
break;
}
else {
yinshis.push_back(yinshu);
number /= yinshu;
}
}
//打印
for(int i = 0; i < int(yinshis.size()); i++)
cout << yinshis[i] << " ";
return 0;
}
质因数分解
最新推荐文章于 2020-03-21 17:22:48 发布