#include<stdio.h>
int n,m,p;
int d;
int flag=0;
int count=0;
int main()
{
scanf("%d",&n);
d=n%2;
if(d==0){
n-=1;
}
for(m=n;m>=4;m-=2){
for(int i=m-1;i>=2;i--){
if(m%i==0){
flag=1;
break;
}
}
if(flag==0){
p=m-2;
for(int i=p-1;i>=2;i--){
if(p%i==0){
flag=1;
break;
}
}
if(flag==0){
count++;
}
}
flag=0;
}
printf("%d",count);
}
上述代码在最后一个测试点显示运行超时。
--------------------------分割线--------------------------
#include <stdio.h>
int a[100000];
int n;
int i,j;
int count=0;
int k=0;
int flag=0;
int comp=0;
int main(){
scanf("%d",&n);
a[0]=2;
for(i=3;i<=n;i++){
for(j=0;j<=k;j++){
if(i%a[j]==0){
flag=1;
break;
}
}
if(flag==0){
a[++k]=i;
comp=1;
}
flag=0;
if(comp==1){
if(a[k]-a[k-1]==2){
count++;
comp=0;
}
}
}
printf("%d",count);
}
修改了一下:判断是否为素数时对比之前所有的素数;判断是否是素数对时直接前后判断。
测试通过。