C++PAT乙级刷题笔记1007 素数对猜想

目录

题目概述:

输入格式:

输出格式:

输入样例:

输出样例:

分析过程 

第一次写的代码

第二次写的代码:

总结: 


题目概述:

1007 素数对猜想 (20 分)

让我们定义dn​为:dn​=pn+1​−pn​,其中pi​是第i个素数。显然有d1​=1,且对于n>1有dn​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

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

输入格式:

输入在一行给出正整数N

输出格式:

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

输入样例:

20

输出样例:

4

分析过程 

1.一看这个题目数据很大就害怕,设计不好等会恐怕就得超时。

2.复习了一下数学,素数的概念是:只能被自己和1整除,且1不是素数。

2.先凭借感觉写了一下,其实这题能做出分数不难,难的是把点全过掉。

3.写完后看到程序里两个嵌套循环感觉大事不好,果然只拿到16分,一个点错误,一个点超时。

4.尝试改良,但是想不到改变两层for循环的办法,只在循环变量增加的速度上做出了一些改进。

可惜仍然只拿到16分,仍然一个点错误,一个点超时。

第一次写的代码

#include<iostream>
using namespace std;
bool ss(int n)//定义一个判断是否为素数的函数,为素数返回1,非素数返回0
{
	bool f = true;
	for (int i = 2; i < n; ++i)
	{
		if (!(n%i))//素数定义:只能被自己和1外的数整除,一旦找到了例外,就不是素数
			return false;
	}
	return true;
}
int main()
{
	int N;
	bool yn=false;/*定义一个布尔变量来标记遇到的是一对素数对的第一个素数还是第二
				  个素数(素数对数量增加的条件为:出现第一个素数且出现第二个素数)*/
	cin >> N;
	//第一对素数对很特殊,单独考虑
	if (N<=2)
		cout << 0;
	if ((N<=4)&&(N>2))
		cout << 1;
	if (N > 4)
	{
		int account=1;//素数对数量
		for (int i = 5; i <= N; i += 2)//因为3以后所有素数至少相差2,所以每次循环加2
		{
			if (ss(i))//如果发现一个素数
			{
				if (!yn)//如果是素数对的第一个素数,不增加次数(因为有可能第二个素数超N)
					yn = true;
				else//如果是素数对的第二个素数,那么增加次数
				{
					++account;
					yn = false;//反复开关布尔
				}
			}
		}
		cout << account;
	}
	return 0;
}

第二次写的代码:

#include<iostream>
using namespace std;
bool ss(int n)//定义一个判断是否为素数的函数,为素数返回1,非素数返回0
{
	bool f = true;
	for (int i = 2; i < n; ++i)
	{
		if (!(n%i))//素数定义:只能被自己和1外的数整除,一旦找到了例外,就不是素数
			return false;
	}
	return true;
}
int main()
{
	int N;
	cin >> N;
	//第一对素数对很特殊,单独考虑
	if (N <= 2)
		cout << 0;
	if ((N <= 4) && (N > 2))
		cout << 1;
	if (N > 4)
	{
		int account = 1;//素数对数量
		for (int i = 5; i <= N; i += 2)//因为5以后所有素数至少相差2,所以每次循环加2
		{
			if (ss(i))//如果发现一个素数
			{
				if ((i + 2) <= N)//确保第二个素数没超过N
				{
					i += 2;//加2加快效率
					++account;
				}
				else//如果超过了,那么对素数对的检查全部完毕,最后一次并不计入
					break;
			}
		}
		cout << account;
	}
	return 0;
}

总结: 

1.上网查找发现,对于素数的查找可以只到根号n,且偶数一定不是素数可以跳过只检查奇数一口气复杂度降到接近n,绝了。

2..
事实上,如果一个数不是素数那么就一定存在着若干因子相乘,比如6 =23;假如这个数的最小因子是p,比如这里的2,那么一定有pp<=n,因此p<sqrt(n).(根号n)。

而我们只需要知道,素数是不可能含有除自己和1以外的因子的,所以我们只需要判断那个比较小的因子的范围内判断就行了。

当然,我们也不用担心n开根号是它本身,因为这只有n = 1或n = 0的时候才办得到。
————————————————
版权声明:本文为CSDN博主「小米菲爱学习」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/miffy_love_zyx/article/details/109445334

3.数学差看来是原罪。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

102101141高孙炜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值