题目:质因数分解
题目来源: 2012年NOIP全国联赛普及组
CodeVS题号: 1313
题目描述 :已知正整数 n是两个不同的质数的乘积,试求出较大的那个质数 。
输入描述 Input Description
输入只有一行,包含一个正整数 n。
输出描述 Output Description
输出只有一行,包含一个正整数p,即较大的那个质数。
样例输入 Sample Input
21
样例输出 Sample Output
7
数据范围及提示 Data Size & Hint
【数据范围】
对于60%的数据,6≤n≤1000。
对于100%的数据,6≤n≤2*109。
题解:
题目要我们求的,是某个数的最大质因数,首先,要求的数要先满足两个条件(1) 它要是个质数 (2)它要能被题目所给数整除
好了 一般思路,从小到大循环求这个数(从小到大查找可以极大减小运行次数),看看能不能把题目所给的数整除,而且还要是个质数,是就输出,解决;
代码如下:
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int pd(int i)//判断是否为质数
{
for(int j=2;j<=sqrt(i);j++)
{
if(i%j==0)
return 0;
}
return 1;
}
long long int n,ans,q;
int main()
{
cin>>n;
for(int i=n-1;i>=2;--i)//从大到小循环 找到就退出
{
if(n%i==0)
{
if(pd(i)==1)
{
ans=i;
break;
}
}
}
printf("%lld",ans);
return 0;
}
ps:但问题真的那么简单吗,仔细思考,我们会发现,题目已经保障了数据一定是两个质数想乘而得到的,这意味着除了1和它本身,它只能被其他两个质数整除,所以,还判断什么质数啊,找到可以整除的最大数,直接输出吧,骚年。
(注意从小到大进行查找)
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
long long int n,ans,q;
int main()
{
cin>>n;
for(int i=1;i<=n;++i)//从小到大循环 找到就退出
{
if(n%i==0)
{
ans=n/i;
break;
}
}
printf("%lld",ans);
return 0;
}