PAT乙級:1007. 素數對猜想 (Java)
阿新 • • 發佈:2019-01-23
本題不難,重在理解題意中N的含義。此處N的意思為最大的素數不超過N。我們最平常的思路如下:先將所有的小於N的素數算出,再找相鄰差為2的:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int N=0;
N=s.nextInt();
//求素數,並新增到Arraylist之中
List<Integer> list_int=new ArrayList<Integer>();
for (int i = 1; i <= N; i++) {
boolean is_prime=true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i%j==0) {
is_prime=false;
}
}
if (is_prime) {
list_int.add(i);
}
}
//輸出
ListIterator<Integer> lit=list_int.listIterator();
int left=lit.next();
int right=0;
int count=0;
while (lit.hasNext()) {
right=lit.next();
if (right-left==2) {
count++;
}
left=right;
}
System.out.println(count);
}
}
當然,我們發現此題目有一個特點:不斷比較相鄰的素數相差是否為 2 。比較相鄰幾項的題目一般都可以用幾個變數來搞定而不用陣列,但會增加一點時間上的開銷。
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int N=0;
N=s.nextInt();
int left=-1;//相鄰兩個數左邊的數
int right=-1;//相鄰兩個數右邊的數
int count=0;//記錄所有滿足條件的次數
for (int i = 2; i <= N; i++) {
boolean is_prime=true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i%j==0) {
is_prime=false;
}
}
if (is_prime) {//如果這個數是素數
if (left==-1) {//當左面比較的數還沒有時,初始化左面的數
left=i;
}else if (right==-1) {//當右面的數為空時
right=i;
if (right-left==2) {//比較相差是否為2
count++;
}else{
}
//無論是否符合相差為2,都將右部置空
left=right;
right=-1;
}
}
}
System.out.println(count);
}
}