【PAT】1007 素数对猜想 (含快速筛选素数方法)

【PAT】1007 素数对猜想 (含快速筛选素数方法)

题目

1007 素数对猜想 (20分)

让我们定义dn为:dn=pn+1-pn,其中pI是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<105​​ ),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N。

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

思路

  1. 快速筛选素数,方法为从2开始筛选,剔除所有2的倍数,再剔除所有3的倍数,依次筛选至符合i2<n的i数处。
  2. 筛选相邻差为2的素数并计数。

问题点

  1. 数组下标为0至n-1,计算n以内素数时要注意。
  2. 快速筛选素数时使用了i2,由于是int型变量,有效表示范围最大值为231-1,i超过约215时将使i2上溢。
    使用Xcode编码出现错误如下:
  3. Thread 1: EXC_BAD_ACCESS (code=1, address=0x7ffcefe76594)
    

代码

#include<stdio.h>

int countPrimes(int isPrim[],int n) {//生成n以内的素数数组及个数
    int count = 0;
    for (int i = 2; i < n+1; i++){
        if (isPrim[i]!=-1){
            isPrim[count]=i;
            count++;
            if(i*i<n+1&&i<46340){//注意防止i^2溢出
                for (int j = i * i; j < n+1; j += i)isPrim[j] = -1;
            }
        }
    }
    return count;
}

int main(){
    int n;
    scanf("%d",&n);
    int isPrim[n+1];
    int count = countPrimes(isPrim, n);
    int countd = 0;
    for(int i=1;i<count;i++){
        if(isPrim[i+1]-isPrim[i]==2){
            countd++;
        }
    }
    printf("%d",countd);
    return 0;
}

补充代码

输出m-n范围内的素数方法

int countPrimes(int isPrim[],int m,int n) {//生成m-n的素数数组及个数
    int count = 0;
    for (int i = 2; i < n+1; i++){
        if (isPrim[i]!=-1){
            if(i>=m){
                isPrim[count]=i;
                count++;
            }
            if(i*i<n+1&&i<46340){//注意防止i^2溢出
                for (int j = i * i; j < n+1; j += i)isPrim[j] = -1;
            }
        }
    }
    return count;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值