PAT乙级1007题解(C语言实现)

大家好啊,这里是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)新的一周马上到来了,加油!


本次博客到这里就结束了,如果你觉得我的文章还不错的话,请给我多多点赞评论哦!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值