1007 素数对猜想 (20分)
素数:除了1和他本身,不会被任何数所除的数就是素数
让我们定义d n 为:d n =p n+1 −p n ,其中p i 是第i个素数。显然有d 1
=1,且对于n>1有d n 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N(<10 5 ),请计算不超过N的满足猜想的素数对的个数。
输入格式: 输入在一行给出正整数N。
输出格式: 在一行中输出不超过N的满足猜想的素数对的个数。
输入样例: 20
输出样例: 4
这里吐槽一下,Java实在时太慢了,做这种算法题,完全不能和C和C++比,人家几ms就解决了,Java要一两百ms,一不小心就会超时,太难了,我调整这道题的写法,写死我了
代码
在做第一种方法时,我不知道ArrayList中的contain方法,所以在剔除重复的数,我还想了好久,还真有够傻的,有contain这个方法,做起来快多了
我还犯一个比较傻的错误,进行循环的时候.落下了一个等号,最后一个数查不到是不是素数,当时,我还一直在找哪里错了,一直没发现,害!
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class C_07 {
public static void main(String[] args) throws Exception {
BufferedReader bb = new BufferedReader(new InputStreamReader(System.in));
int c = 0;
int b = 0;
int j = 0;
List<Integer> num = new ArrayList<>();
List<Integer> count = new ArrayList<>();
int n = Integer.parseInt(bb.readLine());
for (int i = 3; i <= n; i++)//运行时最后一个数要注意,不能遗漏
for (j = 2; j <i; j++) {
if (i % j == 0) break;
else if ((j==i-1) && !num.contains(i))
num.add(i);
}
for (int k = 0; k < num.size() - 1; k++) {
if (num.get(k + 1) - num.get(k) == 2) {
count.add(num.get(k));
count.add(num.get(k + 1));
}
}
System.out.print(count.size() / 2);
}
}
第二种方法
第二种方法就是没有数组存储,而是直接判断两个相邻的数是否符合条件,直接输出对数.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class C_07_2 {
public static void main(String[] args) throws Exception {
BufferedReader bb = new BufferedReader(new InputStreamReader(System.in));
int pre = 2;
int j = 0;
int count = 0;
Integer n = Integer.parseInt(bb.readLine());
for (int i = 3; i <=n; i++) {
for (j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) break;
}
if (j > Math.sqrt(i)) {
if (i - pre == 2)
count++;
pre=i;
}
}
System.out.println(count);
}
}
写这道题,我真的要被这个折磨死了,希望自己越来越厉害,这个寒假冲冲冲!!!
最后,这里是新学编程的三岁,大佬们如果有更方便的方法,希望能在评论区告诉我,我会加以改正,谢谢!