标签:题目 Level int sqrt 20 素数 PAT include
文章目录
一【题目难度】
- 乙级
二【题目编号】
- 1007 素数对猜想 (20 分)
三【题目描述】
- 让我们定义 d n d_n dn 为: d n = p n + 1 − p n d_n =p_{n+1} −p_n dn=pn+1−pn ,其中 p i p_i pi 是第 i i i个素数。显然有 d 1 = 1 d_1 =1 d1=1,且对于 n > 1 n>1 n>1有 d n d_n dn 是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。
- 现给定任意正整数 N ( < 1 0 5 ) N(<10^5 ) N(<105),请计算不超过 N N N的满足猜想的素数对的个数。
四【题目示例】
-
输入格式:
输入在一行给出正整数 N N N。 -
输出格式:
在一行中输出不超过 N N N的满足猜想的素数对的个数。 -
输入样例:
20 -
输出样例:
4
五【解题思路】
- 这个题还是比较好想的,主要思路就是枚举1~n(包括n,因为题目说不超过,所以是≤)中的所有素数,然后遍历判断两个素数是否相邻即可。但是有些小细节需要注意如下:
①:要知道1不是素数,虽然2是素数,但是没有能和它配对的,所以2也不计算在内
②: f o r for for循环每次的增长为2,原因是从3开始,保证以奇数增长,因为偶数肯定不是素数(除了2),所以之判断奇数即可
③:要保证 i & & i + 2 ≤ n i \quad \&\& \quad i+2 ≤ n i&&i+2≤n
④:编写判断素数的函数不能直接从头到尾遍历,否则其中有一个用例一直运行超时,所以需要优化:我们知道如果一个数能被2~n之间的任一整数整除,其中有一个因子必然小于等于 m \sqrt{m} m ,另一个因子必然大于等于 m \sqrt{m} m ,他们都是成对出现的,所以我们只需要遍历从2到 m \sqrt{m} m ,如果不是素数,自然有因子被取模等于0,这样就可以判断了,而且速度更快
六【最终得分】
- 20分
七【代码实现】
#include<stdio.h>
#include<stdbool.h>
#include<math.h>
bool isPrimeNumber(int x)
{
int sqr = (int)sqrt(1.0*x);
for(int i = 2;i<=sqr;i++)
{
if(x % i == 0)
{
return false;
}
}
return true;
}
int main()
{
int n,res = 0;
scanf("%d",&n);
for(int i = 3;i + 2 <= n;i+=2)
{
if(isPrimeNumber(i)&& isPrimeNumber(i+2))
{
res++;
}
}
printf("%d",res);
return 0;
}
八【提交结果】
标签:题目,Level,int,sqrt,20,素数,PAT,include 来源: https://blog.csdn.net/IronmanJay/article/details/122709380
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。