总时间限制: 1000ms 内存限制: 65536kB
描述
已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。
输入
输入只有一行,包含一个正整数 n。
对于60%的数据,6 ≤ n ≤ 1000。
对于100%的数据,6 ≤ n ≤ 2*10^9。
输出
输出只有一行,包含一个正整数 p,即较大的那个质数。
样例输入
21
样例输出
7
分析题目:
- 因为该正整数是两个不同的质数的乘积,由此可知该正整数只有两组数相乘可得到,一组为1和其本身,另一组则是这两个不同的质数(也就是可以不用分析n%i==0中的i是否为质数)
- 由题意可知:对于60%的数据,6 ≤ n ≤ 1000。对于100%的数据,6 ≤ n ≤ 2*10^9
也就是数的范围比较大,又因为该题目有时间的限制。所有循环不能从1到2*10^9,否则就会超时,要用break,当所要求的质数将其较小的得到了,就可以得到另一个较大的数了,则循环可以终止。 - 附言:解法一为通过答案且不超时;解法二也是通过答案只是由于考虑了数是否为质数,解法三超时由于循环是从1到2*10^9且没有用break,则会超时;但是以上解法除去时间限制问题都为正确答案,但是解法三只适用于小范围,不适用于大范围,否则消耗时间相对很大。
解法一:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n=in.nextInt();
int i,a;
for(i=2;i<=Math.sqrt(n);i++) {
if(n%i==0) {
a=n/i;
System.out.println(a);
break;
}
}
}
}
解法二:(如果判断数是否为质数)
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int i,j,pin,a;//pin表示n的开根值
for(i=2;i<n;i++) {
for(j=2;j<i;j++) {//判断i是否为质数
if(i%j==0) {
break;
}
}
if(i==j) {
if(n%i==0&&i<=Math.sqrt(n)){
a=n/i;
System.out.println(a);
break;
}
}
}
}
}
解法三:(超时)
没有使用break,循环会从一直进行到2*10^9为止,导致超时
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int i,pin,a;//pin表示n的开根值
for(i=2;i<n;i++) {
if(n%i==0&&i<=Math.sqrt(n)){
a=n/i;
System.out.println(a);
}
}
}
}