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

B1007 素数对猜想

程序员文章站 2024-03-15 15:53:11
...

B1007 素数对猜想

让我们定义\(d_n\)为:\(d_n =p_{n+1}−p_n\),其中\(p_i\)是第i个素数。显然有\(d_1=1\),且对于n>1有\(d_n\)是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

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

输入格式:

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

输出格式:

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

输入样例:

20

输出样例:

4

思考

先搞出10000的素数表来

const int MAXN=10009;
bool isPrime[MAXN];
void initPrime()
{
    int i,j;
    for(i=0;i<MAXN;i++)
        isPrime[i]=true;
    isPrime[0]=false;
    isPrime[1]=0;
    for(i=2;i<MAXN;i++)
    {
        if(isPrime[i]==true)
        for(j=i*i;j<MAXN;j+=i)
        {
            isPrime[j]=false;
        }
    }
}

20以内的素数是:
2、3、5、7、11、13、17、19、23

3-2=1
5-3=2
7-5=2
11-7=4
13-11=2
17-13=4
19-17=2
有4个结果是2,所以输出20,输出4
我生成了一个素数表,但是这种办法没有单独记录素数序列。
num记录了素数的个数,那么这个数是奇数还是偶数?无所谓,因为只有num-1个距离
上了10的5次方的素数表便怎么样?
附上我的最后一个测试点段错误的代码

#include<cstdio>
#include<cstring>

const int MAXN=10009;//const int MAXN=110050(非筛法);或者是1000001(筛法)
bool isPrime[MAXN];
int prime[MAXN];
void initPrime()
{
    int i,j;
    for(i=0;i<MAXN;i++)
        isPrime[i]=true;
    isPrime[0]=false;
    isPrime[1]=false;
    for(i=2;i<MAXN;i++)
    {
        if(isPrime[i]==true)
        for(j=i*i;j<MAXN;j+=i)
        {
            isPrime[j]=false;
        }
    }
}
int main(void){
    initPrime();
    int j,N,d=0,count=0;
    int num = 0;
    scanf("%d",&N);
    for(int i=0;i<=N;i++){
        if(isPrime[i]==true)
            prime[num++]=i;
    }
    for(j=0;j<num-1;j++){
        d = prime[j+1] - prime[j];
        if(d==2)
            count++;
    }
    printf("%d",count);
    return 0;
}

作者:哈哈菌
来源:CSDN
原文:https://blog.csdn.net/rbcryst/article/details/58223303
版权声明:本文为博主原创文章,转载请附上博文链接!

#include<cstdio>
#include<cmath>
bool judge(int a){
    int flag=1;
    int x=floor(sqrt(a));
    int k=2;
    if(a==1)
        return 0;
    while(k<=x&&a%k!=0)
        k++;
    if(k<=x)
        return 0;
    else
        return 1;
}
int main(){
    int N;
    int num=0;
    scanf("%d",&N);
    if(N==1||N==2)
        printf("0\n");
    else{
        for(int j=3;j<=N;j++){
            if(judge(j)&&judge(j-2))
                num++;
        }
    printf("%d\n",num);
    }
    return 0;
} 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int pri[100110] = {0};
 
int prime(int a) {
    if(a % 2 == 0 && a != 2) {
        return 0;
    }
    for(int i = 3; i * i <= a; i++) {
        if(a % i == 0) {
            return 0;
        }
    }
    return a != 1;
}
 
int main() {
    int n;
    int sum = 0, sub = 0;
    cin >> n;
    for (int i = 2; i <= 100010; i++) { //一次性筛选出最大范围内的所有素数 
        if(prime(i)) {
            pri[sub++] = i;
        }
    }
    for(int i = 1; pri[i] <= n; i++) {  //求出n以内的素数对的对数 
        if(pri[i] - pri[i - 1] == 2) {
            sum++;
        }
    }
    cout << sum << endl;
    return 0;
}

作者:指点
来源:CSDN
原文:https://blog.csdn.net/hacker_zhidian/article/details/51582086
版权声明:本文为博主原创文章,转载请附上博文链接!
我的代码,对空间要求比较大,因为要预先打表。
人家的代码,则着重于素数的判断,而不是打表,另外,判断j与j-2都是素数,和我作相邻两素数差的思路不同。
这么看来10的5次方以内的素数,就有应用时不一定非要打表做的快,也可能判断做的快。
为什么筛法打表反而不能AC呢?玄学,筛法打表是效率更高的。应该是我的筛法没有同时生成序列,所以效率不如判断+序列。

使用筛法,可以很容易的产生素数以及范围,两种范围问题,只需要略作修改,即可实现两种条件限制。
最终使用筛法的AC代码

#include<cstdio>
#include<cstring>

const int MAXN=1000009;
bool p[MAXN] ={0};
int prime[MAXN], num=0;
void initPrime(int n)
{
    for(int i=2;i<= n;i++){//i < MAXN
        if(p[i] == false){
            prime[num++] = i;
            //if(num >= n) break;//只需要n个素数
            for(int j=i+i;j<MAXN;j+=i){
                p[j] = true;
            }  
        }   
    }
}
int main(void){
    int j,N,d=0,count=0;
    scanf("%d",&N);
    initPrime(N);
    for(j=0;j<num-1;j++){
        d = prime[j+1] - prime[j];
        if(d==2)
            count++;
    }
    printf("%d",count);
    return 0;
}

上一篇: 123

下一篇: 求N的阶乘