【华为OD机试真题 C++】素数之积 【2022 Q4 | 100分】
前言
■ 题目描述
【素数之积】
RSA加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高。
给定一个32位正整数,请对其进行因数分解,找出是哪两个素数的乘积。
输入描述
一个正整数num
0 < num <= 2147483647
输出描述
如果成功找到,以单个空格分割,从小到大输出两个素数,分解失败,请输出-1 -1。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
15
输出
3 5
说明
因数分解后,找到两个素数3和5,使得3*5=15,按从小到大排列后,输出3 5。
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
27
输出
-1 -1
说明
通过因数分解,找不到任何素数,使得他们的乘积为27,输出-1 -1。
C++代码实现:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
bool isPrime_3( int num )
{
if(num == 2|| num== 3 )
return true;
if(num % 6 != 1 && num % 6 != 5)
return false;
int tmp = sqrt(num);
for(int i = 5;i <= tmp; i += 6 )
if(num % i == 0|| num % (i+2) == 0 )
return false;
return true ;
}
void Prime(int n, vector<int>& vec)
{
if (n <= 1)
{
return;
}
for (int i = 2; i < n; ++i)
{
if (isPrime_3(i))
{
vec.push_back(i);
}
}
return;
}
void IsDecode(int n, vector<int> prime_vec, vector<int>& decode_prime_vec)
{
for (int & i : prime_vec)
{
if (n % i == 0)
{
decode_prime_vec.push_back(i);
n /= i;
}
}
}
int main(int argc, char** argv)
{
vector<int> prime_vec;
vector<int> decode_prime_vec;
int n;
cin >> n;
Prime(n, prime_vec);
IsDecode(n, prime_vec, decode_prime_vec);
if (decode_prime_vec.empty())
{
cout << -1 << "," << -1 << endl;
return 0;
}
for (int i = 0; i < decode_prime_vec.size(); i++)
{
cout << decode_prime_vec[i];
if (i != decode_prime_vec.size()-1)
{
cout << ",";
}
}
return 0;
}
