质因数分解(C++)(求最小质因数反求最大质因数)

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;
}

【注意】:有时候直接求难求、超时、麻烦时,可以考虑求反面,再转换一下即可。
有时候可以适当利用算术平方根缩小范围。

猜你喜欢

转载自blog.csdn.net/CSDNWudanna/article/details/106436217