题目描述
已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
输入一个正整数 n。
输出格式
输出一个正整数 p,即较大的那个质数。
输入输出样例
输入 #1
21
输出 #1
7
说明/提示
1≤n≤2×1000000000
NOIP 2012 普及组 第一题
代码
#include <bits/stdc++.h>
using namespace std;
long long n;
bool pd(int v) //判断当前v是否为素数.
{
bool flag = 1;
for(int i=2;i<v;i++)
{
if(v%i == 0)
{
flag=0;
}
}
if(flag == 1) return 1;
return 0;
}
int main()
{
cin>>n;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0 && pd(i)==1 && pd(n/i)==1)
{
cout<<n/i<<endl;
break;
}
}
return 0;
}
如果你用的是这个代码,测试点将会是这样:
有一个超时了,因为
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0 && pd(i)==1 && pd(n/i)==1) //pd(i)==1 就意味着 pd(n/i)==1.所以pd(n/i)==1可删去
{
cout<<n/i<<endl;
break;
}
}
AC代码
#include <bits/stdc++.h>
using namespace std;
long long n;
bool pd(int v) //判断当前v是否为素数.
{
bool flag = 1;
for(int i=2;i<v;i++)
{
if(v%i == 0)
{
flag=0;
}
}
if(flag == 1) return 1;
return 0;
}
int main()
{
cin>>n;
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0 && pd(i)==1)
{
cout<<n/i<<endl;
break;
}
}
return 0;
}
测试点信息