• B1007 素数对猜想


    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
    ");
        else{
            for(int j=3;j<=N;j++){
                if(judge(j)&&judge(j-2))
                    num++;
            }
        printf("%d
    ",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;
    }
    
  • 相关阅读:
    Python GIL-------全局解释器锁
    JavaScript简介
    MongoDB查询
    创建、更新和删除文档
    MongoDB基础知识
    Linux安装mysql
    函数、变量、参数
    循环语句
    控制语句
    集合
  • 原文地址:https://www.cnblogs.com/lingr7/p/10292004.html
Copyright © 2020-2023  润新知