已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数。
该题已明确表明n为两个不同质数的乘积,故不用再去判断其因子是否为质数。
很明显,对于该题很多人的第一想法都是从2往n-1找因子。实际上,只需从2找到n的平方根处即可。
下面先介绍一下判断质数的办法
void isprime (int n)
{
int m= (int)sqrt((double)n); //找到其开方数,当n为很大数时,可节省时间
for (int i=2; i<m; i++)
{
if (n%i!=0)
{
cout<<"TRUE"<<endl;
break;
}
else
{
cout<<"ERROR"<<endl;
break;
}
}
}
以上是判断质数的方法。针对该题当然可以找因子并判断其是否为质数,再比较其大小,找出最大的质数。但该题由更简单的做法:
给出的数为两数之积,其中一个数x<=另一个数y,故可以找到其最小的质因子之后再求出最大的质因子。
{
unsigned long long int n; cin>>n;
int i,m,j; m=(int)sqrt((double)n);
for (i=2; i<=m; i++)
{
if (n%i==0)
{
cout<<n/i<<endl; break;
}
}
}
这里用unsigned long long int 是应为该题有限制条件:2<n<2*10^10. 对于大数运算而言,找到最小的质因子比找到最大的质因子容易很多,再加上给的数就是两个质数的积,其因子一定为质数。