(原)pat1007素数猜想

---恢复内容开始---

1007. 素数对猜想 (20)

时间限制

400 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

CHEN, Yue

让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数。显然有 d1=1 且对于n>1有 dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

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

输入格式:每个测试输入包含1个测试用例,给出正整数N。

输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

1:素数就是我们常说的质数,就是智能能被1和本身整除的数,判断一个数是不是素数最简单的方法就是枚举,即将n 除2 ~ n - 1的数如果存在存在一个数能整除,就不是素数,不过这个算法效率太低,改进一下,

2:根据一个合数的因子,不会大于sqrt(n)n的开方这个定理,可以算出100000以内的素数,再大不是算不出来了而是需要等待很长时间,这样算法也就没什么意义了,

3:筛法求素数这个方法有个缺点,就是需要额外的空间去存储,首先我们要创建一个数组大小为 n + 1,boolean primer[n + 1],初始全为True,每次去最小的素数,然后把在数组 为其倍数的元素筛选掉,这里我们置为false

例如:0 ~ 30这几个数

第一个素数为2 我们筛选掉 4 6 8 10 12 14 16 18 20 22 24 26 28 30

第二个素数为3 我们筛选掉9 15 21 27

.......

直到找出全部素数

第二种方法的python代码实现:

这里我还遇到一个问题这就涉及到代码的组织方式

如果把13行的代码改为

while i * i < n:

  i = i + 1

这样在oj上提交就不能通过,

这是一个值得我自己思考的问题,如果因为代码本身造成的算法效率流失只能说明,是自己的无能了。

 1 #!/usr/bin/env python3
 2 __author__ = ‘chao‘
 3 import math
 4
 5
 6 def isprimer(n):
 7     if n < 2:
 8         return False
 9     if n == 2:
10         return True
11     i = 2
12     temp = math.sqrt(n)
13     while i < temp:
14         i += 1
15         if  n % i == 0:
16             return False
17     return True
18
19
20 def nofprimer(n):
21     count = 1
22     i = 1
23     if n < 3:
24         return 0
25     if n == 3:
26         return 1
27     while True:
28         temp = 6 * i + 1
29         temp2 = temp - 2
30         if temp <= n:
31             if isprimer(temp) and isprimer(temp2):
32                 count += 1
33         else:
34             break
35         i += 1
36     return count
37
38 if __name__ == "__main__":
39     n = input()
40     n = int(n)
41     print(nofprimer(n))

第三种方法代码实现:

import math

p_array = [True]
p_array = [True] * (10000000+1)

def isprimer(n):
    p_array[0] = False
    p_array[1] = False
    if (n < 2):
        return
    i = 2
    while i < n:
        if p_array[i]:
            j = 2
            temp = i * j
            while temp <= n:
                if p_array[temp]:
                    p_array[temp] = False
                j += 1
                temp = i * j
        i += 1
    return

def count_primer(n):
    count = 1
    if n < 5:
        return 0
    if n == 5:
        return count
    i = 1
    while True:
        temp1 = 6 * i - 1
        temp2 = temp1 + 2
        if temp2 > n:
            break
        if p_array[temp1] and p_array[temp2]:
                count += 1
        i += 1
    return count

if __name__ == "__main__":
    n = input()
    n = int(n)
    isprimer(n)
    print(count_primer(n))

刚学python练练手代码还不够规范

时间: 2024-08-01 04:00:04

(原)pat1007素数猜想的相关文章

PAT1007. 素数对猜想 (20)

让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素数”. 现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数. 输入格式:每个测试输入包含1个测试用例,给出正整数N. 输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数. 输入样例: 20 输出样例: 4思路:素数的判断 sqrt减小时间 1 #include<stdio.h

PAT-1007素数对猜想

题目:1007素数对猜想(20分) 让我们定义dn为:dn=pn+1?pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数."素数对猜想"认为"存在无穷多对相邻且差为2的素数".现给定任意正整数N(<10^5),请计算不超过N的满足猜想的素数对的个数. 输入格式 输入在一行给出正整数n 输出格式 在一行中输出不超过n的满足猜想的素数对的个数 输入样例 20 输出样例 4 首先我们要明白怎么判断一个数是否是素数(2,3,5,7...) 质数

FFT/NTT做题方法与调试技巧(+提高码题效率的一些想法)

(其实本文应该写成了"结合FFT讨论的调试技巧+码题方法",语文不好一写文章就偏题QAQ) 有意见欢迎提出,有遗漏欢迎补充! FFT(快速傅里叶变换)/NTT(数论变换)是卷积运算常见而实用的优化 但是FFT/NTT的处理过程并不像暴力运算(差不多是多项式乘法)那样能够直观地反映卷积结果的实时变化. 因此在使用FFT时将会或多或少地加大调试的难度. 如果调试程序时直接跟踪变量,每步手算结果比对,不仅会耽误大量时间,而且效果可能并不理想. 直接肉眼查错效率可能也不太高. 但也正由于FFT

NEFU 2 - 猜想 - [筛法求素数]

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=2 Time Limit:3000ms Memory Limit:65536K Description 哥德巴赫(Goldbach ]C.,1690.3.18~1764.11.20)是德国数学家:出生于格奥尼格斯别尔格(现名加里宁城):曾在英国牛津大学学习:原学法学,由于在欧洲各国访问期间结识了贝努利家族,所以对数学研究产生了兴趣:曾担任中学教师.1725年,到了

NowCoder猜想(素数筛法+位压缩)

在期末被各科的大作业碾压快要窒息之际,百忙之中抽空上牛客网逛了逛,无意中发现一道好题,NowCoder猜想,题意很明显,就是个简单的素数筛法,但竟然超内存了,我晕(+﹏+)~  明明有 3 万多 k 的空间限制……于是我不打表,试了试最暴力的做法,赤裸裸的做法果然超时了,无奈,只好对素数筛法进行位压缩了,这是我目前所能想到的方法了,第一次用上这样的特技,还是调了好一会(位数组里不能用 bool 来定义,具体的话好像 bool 和 int 之类的整型稍有不同:也不能用 int,因其最高位是正负标志

PAT Basic 1007 素数对猜想 (20) [数学问题-素数]

题目 让我们定义 dn 为:dn = pn+1 – pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数."素数对猜想"认为"存在?穷多对相邻且差为2的素数".现给定任意正整数N (< 105),请计算不超过N的满?猜想的素数对的个数. 输?格式: 每个测试输?包含1个测试?例,给出正整数N. 输出格式: 每个测试?例的输出占??,不超过N的满?猜想的素数对的个数. 输?样例: 20 输出样例: 4 题目分析 给出整数N,判断不

CF735D Taxes 哥德巴赫猜想\判定素数 \进一步猜想

http://codeforces.com/problemset/problem/735/D 题意是..一个数n的贡献是它的最大的因子,这个因子不能等于它本身 然后呢..现在我们可以将n拆成任意个数的整数相加,每个数最小只能拆成2, 单独计算每个数的贡献,然后加起来使他的贡献最小..那么我们肯定是拆成质数最赚 因为质数对答案的贡献是1... 所以现在这个问题变成了把一个数拆成最少个数的质数 那么我们不知道最少能拆成多少个质数啊..我一开始想的是你每次找最接近这个数的质数..一直找下去应该是可以的

如何判断素数

在OI与密码学等各个方面,我们经常会遇到需要判断素数的情况.这个问题看似简单,实则不然.判素就像是排序,只会快排是不能走遍天下的,想要成为一名神犇,就需要接触更多的算法. 一:什么是素数 素数,也可以叫做质数.如果一个大于1的自然数,除去1和他本身,不能被其他数字整除,那么他就是一个素数.任何一个大于1的自然数,要么是素数,要么是可以写做一堆素数相乘. 二:素数的性质 (1)质数p的约数只有两个:1和p. (2)初等数学基本定理:任一大于1的自然数,要么本身是质数,要么可以分解为几个质数之积,且

1007. 素数对猜想 (20)

1007. 素数对猜想 (20) 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数."素数对猜想"认为"存在无穷多对相邻且差为2的素数". 现给定任意正整数N (< 105),请计算不超过N的满足猜想的素数对的个数. 输入格式:每个测试输入包含1个测试用例,给出正整数N. 输出格式:每个测试用例的输出占一行,不超过N的满足猜想的素数对的个数. 输入样例: 20 输出样例: 4 分