寻找素数对

#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/archive/2013/04/02/2996355.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值