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\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;
}
												
											B1007 素数对猜想的更多相关文章
- PAT B1007 素数对猜想 (20 分)
		
让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素 ...
 - 【算法笔记】B1007 素数对猜想
		
1007 素数对猜想 (20 分) 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数.“素数对猜想 ...
 - 【PAT】B1007 素数对猜想
		
素数筛筛出规定范围内的所有素数存入数组 遍历数组,如果满足于后边的差2,计数器加加 #include <cstdio> const int maxn = 10000001; int pri ...
 - PAT自测_打印沙漏、素数对猜想、数组元素循环右移、数字加倍重排、机器洗牌
		
-自测1. 打印沙漏() 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号 ...
 - PAT 1007. 素数对猜想 (20)
		
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数."素数对猜想"认为"存在无穷多对相邻且 ...
 - PAT乙级   1007. 素数对猜想 (20)
		
1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...
 - PAT (Basic Level) Practise:1007. 素数对猜想
		
[题目链接] 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素数”. ...
 - PAT-乙级-1007. 素数对猜想 (20)
		
1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...
 - PAT_1007 素数对猜想
		
今天想更的那道题现在还没A出来.先把下午做的一道题更新了吧.快零点了.无奈啊. 问题描述: 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n&g ...
 
随机推荐
- log4net 最快速体验
			
本文供实习司机快速上手log4net最基本功能,共4步,3分钟搞定. 一.添加log4net.dll引用,可使用nuget安装或直接引用文件 二.添加配置 在app.config或web.config ...
 - hibernate课程 初探单表映射1-5 hibernate第一个demo
			
hibernate 开发步骤:(hibernate4.2+mysql6.0) 1 hibernate配置文件(hibernate.cfg.xml) 2 持久化类 3 对象-关系映射文件 4 hiber ...
 - oracle报错:ORA-01658(转自52斋347)
			
在oracle里创建表,报出错:ORA-01658: 无法为表空间space中的段创建 INITIAL 区:或者: ORA-01658: unable to create INITIAL extent ...
 - es6-异步应用
			
异步编程对 JavaScript 语言太重要.Javascript 语言的执行环境是“单线程”的,如果没有异步编程,根本没法用,非卡死不可.本章主要介绍 Generator 函数如何完成异步操作. 传 ...
 - Apache Spark 2.2.0 中文文档 - Structured Streaming 编程指南 | ApacheCN
			
Structured Streaming 编程指南 概述 快速示例 Programming Model (编程模型) 基本概念 处理 Event-time 和延迟数据 容错语义 API 使用 Data ...
 - 【Java/Android性能优 6】Android 图片SD卡缓存 使用简单 支持预取 支持多种缓存算法 支持不同网络类型 支持序列化
			
本文转自:http://www.trinea.cn/android/android-imagesdcardcache/ 本文主要介绍一个支持图片自动预取.支持多种缓存算法.支持数据保存和恢复的图片Sd ...
 - html5 app开发实例 Ajax跨域访问C# webservices服务
			
通过几天的研究效果,如果在vs2010工具上通过webservice还是比较简单的,毕竟是一个项目. 如果您想通过HTML5 做出来的移动APP去访问c#做出来的webservice,那么就没那么简单 ...
 - sqlserver锁表、解锁、查看销表
			
锁定数据库的一个表 代码如下 复制代码 SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 代码如下 复制代码 SELECT * FROM tab ...
 - [Hack] 搭建渗透测试实验环境
			
安装虚拟机镜像,镜像如下: Kali-Linux-2016.1-vm-amd64(https://www.kali.org/) Metasploitable2-Linux(https://source ...
 - win10蓝牙添加设备无法连接
			
解决方法: 打开运行窗口,输入services.msc. 找到蓝牙支持服务(或者Bluetooth Support Service),右键,属性,启动类型选择手动,启动服务. 还不行的话,此电脑右键, ...