Python基础练习 1007 素数对猜想 (20 分)

177 阅读1分钟

Python基础练习 1007 素数对猜想 (20 分)

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

判断素数的方法:
先把除去2以外的偶数去掉,再判断奇数。

核心代码如下:
range(3, int(math.sqrt(x))+1, 2)

问题描述

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

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

输入输出

  • 输入格式

  输入在一行给出正整数N。

  • 输出格式

  在一行中输出不超过N的满足猜想的素数对的个数。

  • 样例输入

  20

  • 样例输出

  4

Python版本 代码如下

本题的核心与难点在于素数的判断,需要牢记并掌握。
解释一下素数:素数一般是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。除了 1 和它本身以外,不能被任何整数整除的数。

import math


# 判断是否为素数
def sushu(x):
    if x!=2 and x%2==0:
        return False
    else:
        for i in range(3, int(math.sqrt(x))+1, 2):
            if x%i==0:
                return False
    return True


n = eval(input())
L=[]
for i in range(2, n+1):  ##存入素数
    if sushu(i):
        L.append(i)
con=0
for k in range(1, len(L)):  ##判断
    if L[k]-L[k-1]==2:
        con+=1
print(con)

C语言版本 代码如下

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXN 10000

// 判断是否为素数
int isPrime(int num){
    int flag = 1;
    int temp = sqrt(num);
    
    for(int i = 2; i <= temp; i++){
        if(num % i == 0) 
            flag = 0;
    }
    return flag;
}

int main(){
    int num;
    scanf("%d", &num);
    memset(a, 0, MAXN);

    int cnt1 = 2, cnt2 = 0;
    int a[MAXN];
    a[2] = 2;
    for(int i = 3; i <= num; i++){
        if(isPrime(i)){
            cnt1++;
            a[cnt1] = i;
            if((a[cnt1] - a[cnt1-1]) == 2){
                cnt2++;
            }
        }
    }
    printf("%d", cnt2);
    return 0;
}

参考学习:
blog.csdn.net/qq_40728667… www.cnblogs.com/fyymonica/p…