寻找素数对

#include<stdio.h>
#include<math.h>
#define max 10001      //素数表范围
int flag[max+1];        //标志一个数是否为素数
int prime[max+1];       //素数表,下标从0开始
int size;              //素数个数
void main()
{
 int i,j,size=0,M,sum,min,a[2],s;
    for(i=2;i<=max;i++)          //将偶数标志为0,奇数标志为1
 {
  if(i%2==0)
   flag[i]=0;
  else
   flag[i]=1;
    }
    for(i = 2; i <= max / 2; i++)  
    {
        if(flag[i]==1)
        {
            for( j = 2*i ; j <= max; j += i) //将已知的素数的倍数标志为0
            {
                flag[j] = 0;
            }
        }
    }
    for( i = 2 ; i <= max; i++)
    {
        if(flag[i]==1)
        {
            prime[size++] = i; //搜索标志为1 的数就是素数,将素数存入prime数组中间
        }
    }

/* for(i=0;i<size;i++)
   printf("%d ",prime[i]);*/
 while(scanf("%d",&M)!=EOF)
 {
  sum=0;
  min=M;   //将最小值赋值为M
  for(i=0;i<size;i++)
  {
   for(j=0;j<size;j++)
   {
    sum=prime[i]+prime[j];    //搜索和为M的两个素数
    if(sum==M)
    {
     s=abs(prime[i]-prime[j]); //找出数之差最小的两个素数
     if(s<min)
     {
      min=s;
      if(prime[i]>prime[j])    //按从小到大输出
      {
       a[0]=prime[j];
       a[1]=prime[i];
      }
      else
      {
       a[0]=prime[i];
       a[1]=prime[j];
      }
     }
    }
    if(sum>M) break;    //两数之和大于M则跳出循环
   }
  }
  printf("%d %d\n",a[0],a[1]);    //用数组a存储两个素数的值
 }
}

原文地址:https://www.cnblogs.com/xuwanghu/p/2996355.html