每日一题--PAT乙级1007

1007 素数对猜想 (20 分)

让我们定义dn​为:每日一题--PAT乙级1007,其中每日一题--PAT乙级1007是第 i 个素数。显然有 每日一题--PAT乙级1007​ =1,且对于n>1有每日一题--PAT乙级1007​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

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

输入格式:

输入在一行给出正整数N

输出格式:

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

输入样例:

20

结尾无空行!

输出样例:

4

结尾无空行!

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include<stdio.h>
#include<math.h>

int main()
{
    int n;
    scanf("%d", &n);
    
    int count = 0;      // 计数(满足猜想的素数对的个数)
    int last = 1;       // 保存上一个素数,这里默认保存了第一个素数1
    for (int i = 2; i <= n; i++) {
        if (i == 2) {
            last = i;   // 如果是2,就直接替换掉1,因为2-1 != 2
            continue;   // 返回循环
        }
        if (i % 2 == 0) // 如果是偶数,则返回循环
            continue;

        int j;
        // 一个正整数一定可以由两个数字相乘得到,而且这两个数字
        // 一个大于等于该正整数的平方根,一个小于等于该正整数的平方根
        // 因此只需对小于等于平方根的数取余即可
        for (j = 3; j <= (int)sqrt(i); j++) {
            if (i % j == 0)
                break;
        }
        // 如果上面的循环是由break跳出的,则一定j有 j <= (int)sqrt(i);
        // 正常循环完的话,j==(int)sqrt(i)+1;
        if (j < (int)sqrt(i) + 1)
            continue;
        else
            if (i - last == 2)  // 判断当前的素数与上一个素数的差是否为2
                count++;
        last = i;   // 修改上一个素数
    }
    printf("%d", count);

    return 0;
}
上一篇:3_Jsp标签_简单标签_防盗链和转义标签的实现


下一篇:WebSessionStore: Could not obtain reference to HttpContext