题目描述:
两个相差为2的素数称为素数对,如5和7,17和19等,本题目要求找出所有两个数均不大于n的素数对。
输入格式:
一个正整数n。1≤n≤1000
输出格式:
所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。
输入样例:
100
输出样例:
3 5
5 7
11 13
17 19
29 31
41 43
59 61
71 73
分析:
这题其实就是让你去一对一对找差值为2的素数然后输出即可。
那怎么判断是素数吗,首先要知道素数的概念:
质数(素数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
-----百度百科
素数概念知道了,那该怎们判断?
只需要从2到进行判断是否为n的因数,如果是因数,那么这个数不是素数,如果枚举完后并没有找到除了1和n的因数那么就是素数,那么好,把这些过程如何压缩成函数?
函数代码:
int sushu(int x)//sushu是函数名,int x是判断的值
{
int t=sqrt(x);
for(int i=2;i<=t;i++)//记住不能从1开始,不懂的看下定义
if(x%i==0)//如果是x的因数返回0
return 0;
return 1;//如果没有除了1和x的因数返回1
}
代码会写了吧?
代码:
#include <bits/stdc++.h>
using namespace std;
int sushu(int x)//sushu是函数名,int x是判断的值
{
int t=sqrt(x);
for(int i=2;i<=t;i++)//记住不能从1开始,不懂的看下定义
if(x%i==0)//如果是x的因数返回0
return 0;
return 1;//如果没有除了1和x的因数返回1
}
int main()
{
int n,flag=0;//flag是用来判断有没有素数对
cin>>n;
for(int i=2;i<=n-2;i++)//从2开始,因为1既不是素数也不是合数
if(sushu(i)==1&&sushu(i+2)==1)
{
printf("%d %d\n",i,i+2);
flag=1;//有素数对的话flag=1
}
if(flag==0) cout<<"empty";
return 0;
}
敢ctrl+c然后ctrl+v你试试
看完了,你学费了吗 ?
验证方法:洛谷B2132 素数对直接AC
有问题的可以在评论区讨论。
补充的知识:
1.合数
什么是合数?
合数的概念:合数是指在大于1的整数中除了能被1和本身整除外,还能被其他数(0除外)整除的数,与之相对的是质数。
--百度百科
2. 1算合数还是质数
1既不是合数也不是质数,因为1的因数只有1本身。
3.为什么作者在判断素数是只枚举到?
剩点时间,因为你会发现从2枚举到n-1没必要,还耗时间