各位亲爱的朋友们你们好啊,时隔几日,我带着一道非常有意思的题目来啦!

前几日有朋友问了我这么一道题:
输入一个整数 N,范围是 0 到 N 的正整数,判断是否存在一个素数对之和为另一个素数且该素数仍在该范围内,如果有,请输出该范围内有多少个这样的素数对
看到这道题很多同学是不是觉得有一点眼熟
素数对猜想
让我们定义 d(n) (n为下标) 为:d(n)=p(n)+1−p(n),其中p(i) 是第 i 个素数。显然有 d(1)=1,且对于 n>1有d(n)是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
现给定任意正整数N(<10^5),请计算不超过N的满足猜想的素数对的个数。
输入格式:
输入在一行给出正整数N。
输出格式:
在一行中输出不超过N的满足猜想的素数对的个数。
输入样例:
20
输出样例:
4

| 没错!此题与PTA的素数对猜想相似,或者说此题就是从素数对猜想这题演变而来,对于众多大佬来说此题不过是过家家一样,非常简单,但是对于刚进入程序员世界的新手们,此题是一个很好的练习思维的题目。 |
因为此题中涉及到了循环,选择等C++的基础知识(当然,在这里疯封是直接以底层代码的形式实现的)
废话不多说了,直接上代码!
#include<iostream>
#define MAX 10000
using namespace std;
int main()
{
int N;
cin >> N;
int a[MAX];//利用宏定义,在修改数据时比较方便
int i=0;
for (int c = 2; c <= N; c++)
{
int flag = 1;
for (int d = 2; d < c ; d++)
{
if (c % d == 0)
{
flag = 0; break;
}
}
if (flag == 1)
{
a[i] = c;
i++;
}//此段代码是为了判断该数是不是素数
//如果是素数,则将其存储在a[]数组内
}
int b[MAX];
int m = 0;
int flag = 0;
for (int x = 0; x < i; x++)
{
for (int y = 0; y < i; y++)
{
int z = a[x] + a[y];//定义一个新变量,用来存储两个素数的和
int k;
for (k = 2; k <= z - 1; k++)
{
if (z % k == 0) break;
}
if (k == z && z <= N)//如果z是素数且在(0,N)的范围内
{
b[m] = z;//将z存储在b[]数组内
m++;
flag++;
}
else
{
break;
}
}
}
cout << flag << endl;
return 0;
}

对于新手而言,此题中的循环与数组比较复杂,难以理清,非常考验思维能力,建议可以画图来理清其中的关系。如果还有不清楚的地方,欢迎私信提问。
542

被折叠的 条评论
为什么被折叠?



