P1075 质因数分解
题目描述
已知正整数nn是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
一个正整数nn。
输出格式
一个正整数pp,即较大的那个质数。
输入输出样例
输入 21
输出 7
说明/提示
n <= 2*10^9
NOIP 2012 普及组 第一题
//直接找最大质因数会超时,所以先求出最小质因数,再用n除以这个数,
//便可以得到最大质因数。(因为n规定是由两个不同的质数的乘积,
//所以相除后一定为最大质因数。同理,n开方后的数不可能为整数,
//所以它的两个质因数一定一个大于n的算术平方根,另一个小于n的算术平方根)
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n,i,j,k;
bool bo = true;
cin>>n;
//用算术平方根缩小范围
for(i=(int)(sqrt((double)n));i>=2;i--){
//可整除
if(n%i==0){
//判断是否为质数
for(j=2;j<=(int)(sqrt((double)i));j++){
bo=true;
//非质数
if(i%j==0){
bo = false;
break;
}
}
//是质数
if(bo){
//利用最小质因数求最大质因数
if(n/i > i) i=n/i;
cout<<i;
break;
}
}
}
return 0;
}
【注意】:有时候直接求难求、超时、麻烦时,可以考虑求反面,再转换一下即可。
有时候可以适当利用算术平方根缩小范围。