文章目录
前言
今天开始学习算法了,之前一直没有好好学习过。但是今天,我总算明白了算法的意义。
一、题目-素数对猜想
让我们定义dn为:dn =p (n+1) −p n ,其中p i 是第i个素数。显然有d 1 =1,且对于n>1有d n 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。 现给定任意正整数N(<10 5 ),请计算不超过N的满足猜想的素数对的个数。二、做题思路
我一开始的想法很简单,直接求出所有的素数,然后每对素数都检查相差是不是2。求素数就直接穷举。
代码如下:
import java.util.Scanner;
public class test2 {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = 2;
int c = 3;
int num = 0;
boolean z = true;
for (int x = 3; x<=a ; x++){
for(int y = 2;y<=x;y++){
if(x%y==0){
z = false;
break;
}
}
if(z){
b = c;
c = x;
if (c - b == 2){
num++;
}
}
z = true;
}
System.out.println(num);
}
}
功能上没有任何问题,但是在拼题上检查时超时了。原因是在数字为10^5时。检查一个数是不是素数的时间太长了。这时我无能为力了。
修改方案
经过查询,判断一个数是不是素数并不需要一直穷举到它本身。只需要算到平方根就行。这样在后期能节省大量的计算时间。java中计算平方根可以使用Math.sqrt(x)。因此,素数判断代码修改为下。
for(int y = 2;y<=Math.sqrt(x);y++){
if(x%y==0){
z = false;
break;
}
}
总结
今天,我终于明白了算法对于程序的意义,之前自己只会用死脑筋,感觉就像打开了一扇大门。虽然只是一个简单的题目,我还是觉得受益匪浅。正好第一篇博客,做个纪念。