大家好啊,这里是Cyber Striver的博客。今天我继续为大家带来PAT乙级的题解。
目录
题目
题解
#include <stdio.h>
int main()
{
int n = 0,i=0,x=0,count=0,sum=0;
scanf("%d", &n);
int a[100000];
for (x = 3; x <=n; x += 2)
{
for (i = 2; i * i <= x; i++)
if (x % i == 0)
break;
if (i * i > x)
{
a[count] = x;
count++;
}
}
for(i=0;i<count;i++)
if (a[i + 1] - a[i] == 2)
sum++;
printf("%d\n", sum);
return 0;
}
思路
这道题的难度只能算作中等,但是我看了一下通过率却只有24.39%。我猜测可能大家被题目中的那个公式被吓到了吧!其实几乎没有关系!接下来我将带大家来看看这道题。
本题的关键就是求素数差,而且是相邻的素数差,这个差还必须是2.
所以基本思路就是:把小于N的素数全部求出来放在一个数组当中,然后一次遍历数组做差,如果差为2,则素数差的数量加一,最后输入素数差的数量。
int n = 0,i=0,x=0,count=0,sum=0;
scanf("%d", &n);
int a[100000]; //因为看见题目给定任意正整数的范围有点大,我就直接怼到100000了
for (x = 3; x <=n; x += 2) //外层循环,控制x从2--n即是求比n小的全部素数
{
for (i = 2; i * i <= x; i++) //内层循环
if (x % i == 0) //如果能整除则不是素数
break;
if (i * i > x) //不能被整除,是素数
{
a[count] = x; //把素数存到数组中,以便后期算差
count++;
}
}
这里要解释一下,为什么x首先要等于3且循环一次要自增2呢?
因为:素数一定是奇数。(使用好这个条件能够减少无效的循环次数)
for(i=0;i<count;i++)
if (a[i + 1] - a[i] == 2)
sum++;
printf("%d\n", sum);
实现遍历数组,找出相邻素数差为2的总个数,并打印出来。
经验总结
1)遇到题目吓人别慌。仔细挖掘本质。
2)素数一定是奇数!
3)新的一周马上到来了,加油!
本次博客到这里就结束了,如果你觉得我的文章还不错的话,请给我多多点赞评论哦!