題目
題意:一個好素數的定義是,他是一個素數,然后他的左右兩邊10區間內存在素數,那么他就是好素數,現在讓你輸入一個數字,這個數字以內的好素數的數量。
解題方法:先把每一個數字是不是素數判斷出來,打個表,要用篩法,或者用線性篩,然后在進行3到n的循環,如果他是素數,就判斷他的左右兩邊是不是有沒有素數,如果有,答案就加一。最后輸出就可以了。
代碼
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <iomanip>
#include<cmath>
#include<float.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
#define sf scanf
#define pf printf
#define scf(x) scanf("%d",&x)
#define scff(x,y) scanf("%d%d",&x,&y)
#define prf(x) printf("%d\n",x)
#define mm(x,b) memset((x),(b),sizeof(x))
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
typedef long long ll;
const ll mod=1e9+7;
const double eps=1e-8;
const int inf=0x3f3f3f3f;
using namespace std;
const double pi=acos(-1.0);
const int N=1e5+12;
bool sushu[N];
int judge(int a) //判斷是不是素數
{int l=a-10,r=a+10,temp=0;if(l<1) l=1;//左邊不能小于1rep(i,l,a){if(sushu[i]){temp++;break; } //有就加temp加一,然后跳出}rep(i,a+1,r+1){if(sushu[i]){temp++;break;}//有就加temp加一,然后跳出}if(temp==2) return true;//要左右兩邊都有,那么之前就要加兩次,必須是2 的時候才能符合好素數return false;
}
int main()
{mm(sushu,true);//全都復制為sushu[0]=sushu[1]=false;int n;scf(n);rep(i,2,sqrt(n)+10){if(sushu[i]) //如果是素數就進入篩選{for(int j=i*i;j<n+15;j+=i)//判斷是不是素數要比n大一些,不能剛好到n不然不夠用sushu[j]=false;}}int ans=0;rep(i,3,n+1){if(sushu[i])if(judge(i))ans++;}prf(ans);return 0;
}