PATレベルB1007。プライムナンバーペアの推測(20ポイント)

タイトルの説明:
d nを次のように定義しましょう:d n = p n + 1-p n、ここでpiはi番目の素数です。明らかに、dは
1
= 1を、そしてd
nが
偶数のn> 1のために「プライムペアの推測」は、「2の差がある隣接するプライム番号のペアが無限にある」と考えています。

ここで、正の整数N(<10
5
)が与えられた場合、推測を満たすNを超えない素数ペアの数を数えてください。

入力形式:
正の整数Nを1行で入力します

出力形式:
Nを超えず、推測を満たす素数ペアの数を1行で出力します。

入力サンプル:
20
出力サンプル:
4

問題解決のアイデア:この
問題は、実行タイムアウトのために
元のアイデアにとどまっています。最初にそれが素数であるかどうかを判断する関数を記述し、次にこれらの素数をベクトルにインストールしてから、2つの隣接する数の間に差があるかどうかを計算します2;結果がタイムアウトしました。
大きなアイデア:
素数を決定するための関数isprimeは、のように記述されます。2から部首aまでの数a、iの場合、aがiのいずれかで割り切れる場合、iは素数ではないことを意味し、falseを返します。それ以外の場合、aは素数を返します。データNを入力すると、forループのiは、i-2とiが5からNまで順番に素数であるかどうかを判断します。それらがすべて素数である場合は、cnt ++の数を数え、最後にcntを出力します。
これは隣接する2つの差です。素数であるかどうかを数字で判断するのは簡単です。また、関数を使用して素数を判断するのも比較的簡単です。
問題解決コード:

#include<iostream>
using namespace std;
bool isprime (int a){
    
    //自定义一个函数判断是否为素数 
	for(int i=2;i*i<=a;i++){
    
    
		if(a%i==0){
    
    
			return false;
		}
	}
	return true;
}
int main() {
    
    
	int n;
	int sum=0;
	cin>>n;
	for(int i=5; i<=n; i++) {
    
    
	  if(isprime(i-2)&&isprime(i)){
    
    
	  	sum++;
	  }
 
	}
	cout<<sum;
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_44867340/article/details/107941110