题目重述
已知正整数
n
n
n是两个不同的质数的乘积,试求出两者中较大的那个质数。
其中
n
≤
2
×
1
0
9
n≤2×10^9
n≤2×109
当然我的思路就真的非常直接了,循环两个乘数,满足乘积正确,并且判断两数为质数,代码如下:
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int x)//判断是否为质数(布尔变量)
{
bool k=true;
long long m;//小心别和i重名了
for(m=2;m<=sqrt(x);m++)
{
if(x%m==0){
k=false;
break;
}
}
return k;
}
int max(long long i,long long j)//取符合要求的最大值
{
long long max;
if(i>j) max=i;
if(i<j) max=j;
return max;
}
int main()
{
long long i,j,x;
cin>>x;
for(i=2;i<=sqrt(x);i++)//其中一者到平方根就行了
{
for(j=2;j<=x;j++)
{
if(i*j==x)
{
if(isPrime(i)&&isPrime(j))
cout>>max(i,j);
}
}
}
return 0;
}
当然结果是没有问题的,但是测试结果如下:
T
i
m
e
L
i
m
i
t
E
x
c
e
e
d
Time Limit Exceed
TimeLimitExceed 说明在算法上这个代码很冗杂! 使用了循环嵌套,时间复杂度
O
(
n
2
)
O(n^2)
O(n2)
于是我想只用一次循环实现这个过程:只循环
i
i
i变量(从2到
s
q
r
t
(
x
)
sqrt(x)
sqrt(x))并判断是否为x的因数,如果是,再判断是否为质数,满足要求的话,
i
i
i就一定是这两个乘数中最小的那个,于是
x
/
i
x/i
x/i也就是我们所求的结果。
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int x)
{
bool k=true;
long long m;
for(m=2;m<=sqrt(x);m++)
{
if(x%m==0){
k=false;
break;
}
}
return k;
}
int main()
{
long long i,j,x;
cin>>x;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)
{
if(isPrime(i))
cout<<x/i;
}
}
return 0;
}
其实再由题目要求,输入的数据已经满足质数相乘,所以可以省去判断质数的函数,本题代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long i,j,x;
cin>>x;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0)
{
if(isPrime(i))
cout<<x/i;
}
}
return 0;
}