1007. 素数对猜想
2017-06-23 14:25
417 查看
一、题目
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数。
输入格式:每个测试输入包含1个测试用例,给出正整数N。
输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4
二、个人理解
此题的其实是在考察素数的判断,然后在给定数的范围内循环判断前后两个素数是否相差2,若是素数,就计数加一。思想很简单,但是本人在第一次写这个程序时用的是python,然后在测试点5时运行超时,当时以为是Python慢,换用了C++,依然运行超时。后来才发现是我的素数判断写的太耗时间。在原来的素数判断中,我是一个个数进行判断,后来我进行改进只对奇数进行判断,顺利通过。在此我希望大家即使不掌握高深的素数判断算法,也应该掌握这个简单又实用的算法。
代码实现:
Python:
#!/usr/bin/env python # encoding: utf-8 def isPrime (n): if (n<2): return False if(n==2): return True else: if(n%2==0):#先判断是否为偶数 return False i=3 #从3开始判断,只进行奇数判断 while(i*i<=n): if(n%i==0): return False i+=2 return True def main(): n=input() result=[] count=0 temp=1 for i in range(2,int(n)+1): if isPrime(i): if(temp+2==i):#判断素数对 count=count+1 temp=i print(count) if __name__=="__main__": main()
测试点 | 结果 | 用时(ms) | 内存(kB) | 得分/满分 |
---|---|---|---|---|
5 | 答案正确 | 358 | 3184 | 2/2 |
#include <iostream> using namespace std; int isPrime(int n) { if (n<2){ return 0; } if(n==2){ return 1; } else if (n%2==0){//先判断偶数 return 0; } for (int i=3;i*i<=n;i=i+2){//在判断奇数,可以缩短判断时间 if(n%i==0){ return 0; } } return 1; } int main() { int n; cin>>n; int count=0; int result=1; for (int i=2;i<=n;i++){ if(isPrime(i)){ if(result+2==i){//判断前后素数是否相差2,即是否为素数对 count++; } result=i; } } cout <<count; }
测试点 | 结果 | 用时(ms) | 内存(kB) | 得分/满分 |
---|---|---|---|---|
5 | 答案正确 | 15 | 384 | 2/2 |
相关文章推荐
- PAT 1007. 素数对猜想
- 乙级 PAT 1007. 素数对猜想 (20)
- 1007 素数对猜想
- 1007. 素数对猜想 (20)
- PAT 1007 素数对猜想 (20)
- 1007. 素数对猜想 (20)
- PAT (Basic Level) Practise (中文)- 1007. 素数对猜想 (20)
- 浙江大学PAT_乙级_1007. 素数对猜想 (20)
- PAT乙级1007. 素数对猜想 (20)
- 1007. 素数对猜想 (20)(java实现)
- 1007. 素数对猜想 (20)
- 1007. 素数对猜想 (20)
- 1007. 素数对猜想 (20)
- PAT-B 1007. 素数对猜想
- PAT 1007. 素数对猜想 (20)
- 1007 素数对猜想
- 1007. 素数对猜想 (20)
- PAT乙级1007. 素数对猜想(20)
- PAT 1007. 素数对猜想 (20) JAVA
- 1007. 素数对猜想 (20)