题目描述
已知正整数nn是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
一个正整数n。
输出格式
一个正整数p,即较大的那个质数。
输入输出样例
输入
21
输出
7
说明/提示
n≤2×10^9
题解:
拿到题目的第一个思路是:要找最大的,那就从最大的n本身往回找,找到最大的质数再判断此质数的另一个乘数是不是质数即可,但是超时了(判断质数花太多时间)。
import java.util.Scanner;
public class P1075NOIP2012普及组质因数分解 {
static boolean isInt(double n) { //判断是否为整数
if (Math.ceil(n)==n) return true; //如果这个数向上取整为本身就是整数
else return false;
}
static boolean isPrime(double n) {
if (n<2) return false;
for (int i=2;i<Math.sqrt(n);i++) {
if (n%i==0) return false;
}
return true;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int n=in.nextInt();
for (double i=n;;i--) { //从大往小找
if (isInt(n/i*1.0)) { //此数得另一个乘数为整数再判断是否为质数
if (isPrime(i)&&isPrime(n/i)) {
System.out.println((int)i);
return;
}
}
}
}
}
发现了如果从后判断质数会超时才醒悟过来为什么不反过来,先求小的质数再乘大的质数是一个道理。(能AC)
import java.util.Scanner;
public class P1075NOIP2012普及组质因数分解 {
static boolean isInt(double n) { //判断是否为整数
if (Math.ceil(n)==n) return true; //如果这个数向上取整为本身就是整数
else return false;
}
static boolean isPrime(double n) {
if (n<2) return false;
for (int i=2;i<Math.sqrt(n);i++) {
if (n%i==0) return false;
}
return true;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int n=in.nextInt();
for (double i=2;;i++) { //从小往大找
if (isInt(n/i*1.0)) { //此数得另一个乘数为整数再判断是否为质数
if (isPrime(i)&&isPrime(n/i)) {
System.out.println((int)(n/i));
return;
}
}
}
}
}
数学方法:找约数,个数能且只能分解为一组质数的乘积。可知,若输入的数满足题目条件,他就只能分解为两个质数的乘积。所以在比他小且大于1的自然数中,只有那两个数能整除它,之间不可能再有任何合数或质数能整除它了,因为最小的能整除它的合数已经是他本身了。
import java.util.Scanner;
public class P1075NOIP2012普及组质因数分解 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int n=in.nextInt();
for (int i=2;i<Math.sqrt(n);i++) {
if (n%i==0) {
System.out.println(n/i);
return ;
}
}
}
}