PAT 1007 素数对猜想

题目描述:

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

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

输入格式:

输入在一行给出正整数N

输出格式:

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

输入样例:

20
 

输出样例:

4

解题思路:

1、根据输入的数计算出所有的素数存储起来

2、遍历得到的素数数组,计算素数对,用两个指针来判断。

3、输出得到的素数对的个数

Python写的最后一个测试用例超时了,,ԾㅂԾ,,Python用的还不是特别熟练,等想到了更好的办法再更新

相同的思路C++就不会超时,,ԾㅂԾ,,两种代码都贴一下叭

Python:

import math as m


def isPrime(num):
    if num <= 3:
        return num > 1
    k = int(m.sqrt(num))
    for nu in range(2, k+1):
        if num % nu == 0:
            return False
    return True


N = int(input())

primelist = []
for i in range(2, N+1):
    if isPrime(i):
        primelist.append(i)

count = 0
for x in range(0, len(primelist)):
    for y in range(x+1, len(primelist)):
        c = primelist[y] - primelist[x]
        if c > 2:
            break
        elif c == 2:
            count += 1

print(count)

C++

#include<iostream>
#include<cmath>
#include<vector>

using namespace std;

bool isprime ( int n ) {
    if ( n <= 3 ) {
        return n > 1;
    }
    // 求平方根,注意sqrt()的参数为 double 类型,这里要强制转换m的类型 
    int k = ( int )sqrt ( ( double )n );
    int i;
    for ( i = 2; i <= k; i++ ) {
        if ( n % i == 0 ) {
            return false;
        }
    }
    // 如果完成所有循环,那么m为素数
    return true;
}
vector<int> nums;
int main () {
    int n;
    cin >> n;

    //计算2-n的全部素数,存储在vector中
    for ( int i = 2; i <= n; i++ ) {
        if ( isprime ( i ) ) {
            //是素数,将数据放入数组中
            nums.push_back ( i );
        }
    }

    int count = 0;//素数对的计数器
    for ( int i = 0; i < nums.size (); i++ ) {
        for (int j = i + 1; j < nums.size (); j++ ) {
            if ( nums [j] - nums [i] > 2 ) break;
            if ( nums [j] - nums [i] == 2 ) count++;
        }
    }

    printf ( "%d
", count );
    system ( "pause" );
    return 0;
}

 

原文地址:https://www.cnblogs.com/syq816/p/12702035.html