输入2个正整数m 和n,输出m到n间的各对孪生素数i和j(m<=i<j<=n)。

如果两个素数之差为2, 称它们是一对孪生素数。要求素数判定用函数完成, 函数prime(int k) 判断k是否为素数。
例:输入:1 10 输出:[3,5] [5,7]
输入:10 20 输出:[11,13] [17,19]
以下是我写的,有问题
#include<stdio.h>
#include<math.h>
int prime(int k)
{int j;
double m;
int s=1;
m=sqrt(k);
for(j=2;j<=m;j++)
{if(k%j==0)
{s=0;
break;}
if(s)
{m=sqrt(k+2);
for(j=2;j<=m;j++)
{if((k+2)%j==0)
{s = 0;
break;}
if(s)
{printf("[%d,%d]",k,k+2);
return 0;}
}
}

}
}
int main()
{ int a,b,i;
scanf("%d%d",&a,&b);
for(i=a;i+2<b;i++)
prime(i+1);
}

好像没有办法使s为0,结束这个循环,那个break只能跳出一层,导致s=1,输出了a到b之间的所有相隔距离为2 的数对。比如1 10,会输出[11,13] [15,17] [17,19]
怎么改呀
下面错了会输出[5,7] [7,9].应该输出[3,5] [5,7]才对

#include<stdio.h>
#include<math.h>
int prime(int k)
{ int j;
  double m;
  int s=k>1;
  m=sqrt(k);
  for(j=2; j<=m; j++)
    if(k%j==0)
    { s=0;
      break;
    }
    if(s)
    { m=sqrt(k+2);
      for(j=2; j<=m; j++)
        if((k+2)%j==0)
        { s = 0;
          break;
        }
        if(s)
        { printf("[%d,%d]  ",k,k+2);
          return 0;
        }
    }
}
int main()
{ int a,b,i;
  scanf("%d%d",&a,&b);
  for(i=a; i+2<b; i++)
    prime(i);
}

追问

还是不行啊

追答

可能是你的姿势不对:-(
照片上我看到一片星星点点。你就不能拍得大一点,充分利用屏幕的像素吗?
你的代码我也没看见。肯定是代码有点问题啦。
要把代码复制上来才可以看清楚啊。

追问

我刚刚又查了一遍代码,我发现我的跟你不一样在于for之后有无{ },
for(j=2;j<=m;j++)
{if(k%j==0)

{s=0;
break;}
我把这个for之后的放在一个{}里了,导致程序有问题
按你的输出是正确的

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-12-09
#include<stdio.h>

bool isPrime(int n){
    int i;
    bool flag=true;
    if(n==1) flag=false;
    for(i=2;i<n;i++){
        if(n%i==0){
            flag=false;
            break;
        }
        else{
            flag=true;
        }
    }
    return flag;
}

int main(){
    int m,n,i;
    scanf("%d%d",&m,&n);
    for(i=m;i<=n-2;i++){
        if(isPrime(i) && isPrime(i+2)) printf("[%d,%d] ",i,i+2);
    }
}

相似回答