题目描述
已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
输入一个正整数 n。
输出格式
输出一个正整数 p,即较大的那个质数。
输入输出样例
输入 #1复制
21
输出 #1复制
7
说明/提示
1≤n≤2×10^9
思路:
暴力枚举,用n从i=2开始取余,因为只要除尽,就输出n/i;
package 循环结构;
import java.util.Scanner;
public class P1075O {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i = 2; i<=n ; i++) {
if(n%i == 0) {
System.out.println(n/i);
break;
}
}
}
}
反思:
一开始用线性筛,先筛出一个质数表用数组存起来,然后用n%这个数组中的数,MLE了.......
只能说,使用线性筛一定要慎重,很容易MLE.....
package 循环结构;
import java.util.Arrays;
import java.util.Scanner;
public class P1075 {
public static int getPrime(boolean is_prime[], int prime[], int n) {
int cnt = 0;
for(int i = 1; i <= n; i++) {
if(is_prime[i] == true)
prime[++cnt] = i;
for(int j = 1;j <= cnt && i*prime[j] <= n; j++) {
is_prime[i*prime[j]] = false;
if(i % prime[j] == 0)
break;
}
}
return cnt;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
boolean is_prime[] = new boolean[n+1];
int prime[] = new int[n+1];
Arrays.fill(is_prime, true);
is_prime[0] = is_prime[1] = false;
int cnt = getPrime(is_prime, prime, n);
for(int i = cnt;i >= 1; i--) {
if(n % prime[i] == 0) {
System.out.println(prime[i]);
break;
}
}
}
}