(PAT乙级)素数对猜想(Python)

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

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

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

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

输入样例:
20
输出样例:

4

这道题我提交了很多次,每次都是最后一个测试点不能通过,借鉴了网上一位老哥的素数算法,虽然比普通算法快了很多,但是还是无法通过。最后让同学用c++写出的普通算法轻松通过所有测试点,用时基本是0ms,感叹c和python的速度差距,之前学校开的c++课没学好,看来要重新学一遍c和c++。


这是普通算法:

n = int(input())
lis = []
for i in range(2,n+1):#判断n个数中素数个数
    if i == 2:#2是素数
        lis.append(i)
    elif i == 3:#3是素数
        lis.append(i)
    elif i%2 != 0:#除2外,所有偶数不是素数
        x = 0
        for a in range(2,int(i**0.5)+1):#在2到根号X的区间内,如果任意一数能被X整除,X必不是素数
            if i%a == 0:
                continue
            else:
                x = x+1
                if x == int(i**0.5)-1:
                    lis.append(i)

a = 0
for i in lis:
    if i+2 in lis:
        a = a+1
print(a)



这是借用了网上一位老哥的算法:

def get(num):#加强版素数算法
    if num == 2 or num == 3:
        return True
    if num%6 != 1 and num%6 != 5:
        return False
    tps = int(num**0.5)
    for i in range(5,tps+1,6):
        if num%i == 0 or num%(i+2) == 0:
            return False
    return True

n = int(input())
lis = []
for i in range(2,n+1):
    if get(i):
        lis.append(i)

a = 0
for i in lis:
    if i+2 in lis:
        a = a+1
print(a)

最后,这是模仿同学写的c++:

#include<stdio.h>
#include<math.h>
#include<iostream>
using namespace std;

bool sushu(int number)
{
	if (number == 2 || number == 3)
	{
		return true;
	}
	if (number %6 != 1 && number %6 != 5)
	{
		return false;
	}
	int temp = sqrt(number);
	for (int i = 5; i<= temp; i += 6)
	{
		if (number %i == 0 || number %(i+2) == 0)
		{
			return false;
		}
	}
	return true;
}

int main()
{
	int n;
	cin>>n;
	int counter = 0;
	for (int i = 2; i <= n; ++i)
	{
		if (sushu(i))
		{
			if (sushu(i+2) && i+2 <= n)
			{
				counter = counter + 1;
			}
			
		}
	}
	printf("%d",counter);
	return 0;
}

2018.2.18补充:

对这题有新的想法,用python提交后发现能通过最后一个测试点了。最后一个点用时183ms。

这次的想法:

        判断为素数后,将素数插入list中,设定一个counter来标记素数的序号,然后通过序号作为index,判断任意两个相邻的素数之差是否为2,再设定一个counter2来统计个数,最后输出counter2。

之前的做法是判断为素数后,插进list中,再用一个for循环遍历这个list,用if语句判断符合条件的素数对个数。这样把判断素数和判断素数对拆分成两部分计算,并且用多次for循环遍历,时间复杂度较高,新的方法避免了拆分,少用了for循环,直接在一个循环中完成了所有的判断,用时更短。

def get(num):#加强版素数算法
    if num == 2 or num == 3:
        return True
    if num%6 != 1 and num%6 != 5:
        return False
    tps = int(num**0.5)
    for i in range(5,tps+1,6):
        if num%i == 0 or num%(i+2) == 0:
            return False
    return True

n = int(input())
lis = []
counter = 0
counter2 = 0
for i in range(2,n+1):
    if get(i):
        lis.append(i)
        counter = counter + 1
        if lis[counter-1]-lis[counter-2] == 2:
            counter2 = counter2 + 1
print(counter2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值