题目
1007 素数对猜想 (20分)
让我们定义dn为:dn=pn+1-pn,其中pI是第i个素数。显然有d1=1,且对于n>1有dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<105 ),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
思路
- 快速筛选素数,方法为从2开始筛选,剔除所有2的倍数,再剔除所有3的倍数,依次筛选至符合i2<n的i数处。
- 筛选相邻差为2的素数并计数。
问题点
- 数组下标为0至n-1,计算n以内素数时要注意。
- 快速筛选素数时使用了i2,由于是int型变量,有效表示范围最大值为231-1,i超过约215时将使i2上溢。
使用Xcode编码出现错误如下: -
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;
}