如果两个素数之差为2,它们就是一对孪生素数。
输入两个正整数n和m,找到[n,m]闭合区间内的所有孪生素数,并按照规定格式输出。
输入格式:
在一行中输入整数n和m,两个数都不超过1000.
输出格式:
从小到大的顺序依次输出区间内的所有孪生素数。
如输入1 10后,输出(3,5)和(5,7),各组孪生素数之后都跟一个空格。
输入样例1:
1 10
输出样例1:
(3,5) (5,7)
输入样例2:
5 30
输出样例2:
(5,7) (11,13) (17,19)
输入样例3:
10 31
输出样例3:
(11,13) (17,19) (29,31)
我们可以通过遍历[n,m]闭合区间内的所有数字,用一个循环去判断每个数字是否是素数,如果是,则用另一个循环去判断相邻的两个素数之差是否为2,如果是,则将它们作为一对输出。
#include<stdio.h>
int main()
{
int n, m;
scanf("%d %d", &n, &m);
int i;
int p1,p2;
for(i=n;i<=m;i++)
{
if(i==2)
{
p1=i;
}else if(i>2)
{
if(i%2==1)
{
if(isPrimeNum(i)){
if(p1!=0)
{
p2=i;
if(p2-p1==2)
{
printf("(%d,%d)",i,i+2);
}
p1=p2;
}else{
p1=i;
}
}
}
}
}
return 0;
}
int isPrimeNum(int i)
{
int j;
for(j=2;j<i;j++)
{
if(i%j==0)
{
return 0;
}
}
return 1;
}有毛病,不知道在哪
下面的输出格式总有问题,不知道咋改
low<high确定搜索范围
flag的作用是用来标记一个数是否为素数,当flag=0时,表示该数为素数,当flag=1时,表示改数不是素数
#include<stdio.h>
int main()
{
int low, high;
scanf("%d %d", &low, &high);
while (low < high)
{
int flag = 0;
//检查low是否为素数
for (int i = 2; i <= low / 2; i++)
{
if (low % i == 0)//如果low可以被i整除,那么它就不是素数
{
flag = 1;
break;
}
}
//如果low是一个素数,则寻找它的下一个素数
if (flag == 0)
{
int nextPrime = low + 1;
//从nextprime开始检查,一直到找到下一个素数
for (int i = 2; i <= nextPrime / 2; i++)
{
if (nextPrime % i == 0)
{
nextPrime++;
i = 1;
}
}
if (nextPrime - low == 2)
printf("(%d,%d) ",low,nextPrime);
low = nextPrime;
}
else
{
low++;
}
}
return 0;
}
运行超时版,哈哈
#include<stdio.h>
int main()
{
int n, m;
scanf("%d %d", &n, &m);
int flag;
while (n < m)
{
flag = 1;
for (int i = 2; i <= n / 2; i++)
{
if (n % i == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
int flag2 = 1;
for (int i = 2; i <= m / 2; i++)
{
if (m % i == 0)
{
flag2 = 0;
break;
}
}
if (flag == 1 && (m - n) == 2)
{
printf("(%d,%d) ", n, m);
}
}
n++;
m++;
}
return 0;
}