简单算法题,素数对猜想


前言

今天开始学习算法了,之前一直没有好好学习过。但是今天,我总算明白了算法的意义。


一、题目-素数对猜想

让我们定义d​n为: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;
                }
            }

总结

今天,我终于明白了算法对于程序的意义,之前自己只会用死脑筋,感觉就像打开了一扇大门。虽然只是一个简单的题目,我还是觉得受益匪浅。正好第一篇博客,做个纪念。

猜你喜欢

转载自blog.csdn.net/qq_43668890/article/details/114043764