欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自测-2 素数对猜想 (20分)

程序员文章站 2022-06-07 14:15:02
...

自测-2 素数对猜想 (20分)

#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);
    
}
    

相关标签: PTA练习题