自测-2 素数对猜想 (20分)
程序员文章站
2022-06-07 14:15:02
...
#include <stdio.h>
#include <math.h>
int PutIndexToPrim(int index);
int main(){
int n,num,i=1,count=0,d;
scanf("%d",&num);
while(PutIndexToPrim(i+1)<=num){
d = PutIndexToPrim(i+1)-PutIndexToPrim(i);
i++;
if(d==2){
count++;
}
}
printf("%d",count);
}
int PutIndexToPrim(int index){
int i,j,count=0;
int flag = 0;
for(i=2;;i++){
int p = sqrt(i);
for(j=2;j<=p;j++){
if(i%j==0){
flag = 1;
break;
}
}
if(flag==0){ //是素数
count++;
}else{
flag = 0;
}
if(count==index){ //找到第index个素数
return i;
}
}
}
上述代码最后一个测试点不能通过于是开始优化代码,发现每次调用PutIndexToPrim()函数都要从1开始重新判断素数,故干脆直接把素数存在一个数组里面,就是一边判断是不是素数(是就存入今数组)一边判断有几对素数对! 奥利给!
#include <stdio.h>
#include <math.h>
int prim[100001];
int main(){
int num;
scanf("%d",&num);
int i,j,count=0,k=0;
int flag = 0;
prim[0] = 2;
for(i=3;i<=num;i++){
int p = sqrt(i);
for(j=2;j<=p;j++){
if(i%j==0){
flag = 1;
break;
}
}
if(flag==0){ //是素数
prim[++k] = i;
if(prim[k]-prim[k-1]==2){
count++;
}
}else{
flag = 0;
}
}
printf("%d",count);
}