C++ P0003--孪生素数

发布于:2022-12-02 ⋅ 阅读:(793) ⋅ 点赞:(0)

Hello, 又来啦~首先公示投票结果:

​​​​​​​​​​​​​​​​ N o . 1 No.1 No.1 水仙花数+孪生素数+数位分离系列 6票
N o . 2 No.2 No.2 数列求和+鸡兔同笼 5票

孪生素数

题目描述

在素数的大家庭中,大小之差为 2 2 2 的两个素数称之为一对“孪生素数”,如 3 3 3 5 5 5 17 17 17 19 19 19 等。请你编程统计出不大于自然数 n n n 的素数中,孪生素数的对数。

输入格式

一行一个正整数 n n n 1 < = n < = 1000 1 <= n <= 1000 1<=n<=1000

输出格式

若干行,每行两个整数,之间用一个空格隔开,从小到大输出每一对孪生素数。

输入输出样例

输入数据

1

输出数据

3 5
5 7
11 13
17 19
29 31
41 43
59 61
71 73

其他:

时间限制 : 1000 m s 1000ms 1000ms 存储大小: 526 k i b 526kib 526kib 测试点: 5 5 5

题目描述完毕,请作答。

读完了题目,我们做一下分析:

首先回顾一下什么是素数:

只有 1 1 1和它本身两个因数的数叫做素数。
例如: 5 5 5 11 11 11

函数

定义一个布尔类型的函数,进行素数判断

温馨提示:bool类型的函数返回值只有 t r u e true true f a l s e false false

首先写出结束条件:如果这个数小于2的话,就不能为素数,

if(n == 1 || n == 0)  return false;
if(n < 2)  return false;

然后循环判断,从2开始,到n结束(优化方法在后)
只要对 i i i 取模为0,也就是说,他除了 1 1 1和它本身两个因数外,还有其他因数(这个数是合数)返回值就为 f a l s e false false.

for(int i = 1; i <= n; i++){
	if(n % i == 0)  return false;
}

否则返回值为 t r u e true true

main()函数

读入整型变量n,插入循环,判断一下如果 i i i和它的兄弟 i + 2 i + 2 i+2都是素数的话,输出即可(不要忘记空格哟)

for(int i = 1; i <= n; i++){
	if(isPrime(i) && isPrime(i + 2)   cout << i << " " << i + 2;    //判断素数的函数···

是时候展示真正的技术了:

#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n){
	if(n == 1 || n == 0)  return false;
	for(int i = 2; i <= n; i++){
		if(n % i == 0)  return false;
	}
	return true;
}
int main(){
	int n;
	cin >> n;
	for(int i = 2; i <= n; i++){
		if(isPrime(i) && isPrime(i + 2))  cout << i << " " << i + 2 << endl;
	}
	return 0;

}

提交之后,竟然是一个大大的 T L E TLE TLE.

超时点在于:isPrime的for循环时间复杂度足足有
O ( n ) O(n) O(n),而如果 n n n是一个很大的数,算得太慢了!!应该怎么办呢?
这个地方可以替换成两种办法:

for(int i = 1; i <= sqrt(n); i++)
for(int i = 1; i * i <= n; i++)

换了这两种方法,就好多了。

最后,附AC代码:

#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n){
	if(n == 1 || n == 0)  return false;
	for(int i = 2; i <= sqrt(n); i++){
		if(n % i == 0)  return false;
	}
	return true;
}
int main(){
	int n;
	cin >> n;
	for(int i = 2; i <= n; i++){
		if(isPrime(i) && isPrime(i + 2))  cout << i << " " << i + 2 << endl;
	}
	return 0;

}
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到