単純なアルゴリズムの問題、素数ペア予想


序文

私は今日アルゴリズムを学び始めました、そして私はこれまでよく勉強したことがありません。しかし、今日、私はついにアルゴリズムの意味を理解しました。


1.トピック-素数ペア予想

dnを次のように定義しましょう:dn = p(n + 1)−p nここで、p iはi番目の素数です。明らかにd1 = 1であり、d nはn> 1の場合でも同様です。「素数予想」は、「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の場合です。数が素数であるかどうかを確認するのに時間がかかりすぎます。現時点では何もできません。

修正

クエリを実行した後、数値が素数であるかどうかを判断することは、それ自体を網羅する必要はありません。平方根まで数えてください。これにより、後の段階での計算時間を大幅に節約できます。Math.sqrt(x)を使用して、Javaの平方根を計算できます。そのため、素数判定コードを以下のように変更します。

            for(int y = 2;y<=Math.sqrt(x);y++){
    
    
                if(x%y==0){
    
    
                    z = false;
                    break;
                }
            }

総括する

今日、ようやくプログラムのアルゴリズムの意味がわかりました。以前は頭を使っただけで、ドアを開けたくなった。簡単なトピックですが、それでも多くのメリットがあると感じています。記念として、ちょうど最初のブログ。

おすすめ

転載: blog.csdn.net/qq_43668890/article/details/114043764