杭电 1262 寻找素数对 【素数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1262
解题思路:先将题目中给出的偶数范围内的素数打表,设输入的那个偶数为n,这样找到n/2在素数表的位置k,从pn[k]到pn[2];以及从pn[k]到pn[10000]依次判断相加是否等于n即可。
反思:注意像 10和26这样的偶数,应该输出的是 5 5;13 13;所以应该单独处理这种n/2等于一个素数的偶数
ps:这是在杭电的100题,这三个多月来,加油!!!!!fighting!!!!!!
#include <stdio.h>
#include <math.h>
#define N 10000
int p[N]; //判断p[i]中的i是否为素数
int pn[N]; //存储素数
void prim_num()
{
int i,j,n;
for(i=1; i<=N; i++)
p[i]=1;
n=(int)sqrt(N);
for(i=2; i<=n; i++)
{
for(j=i+i; j<=N; j+=i) //素数的合肯定不是素数,这就是判断哪些数不是素数
{
p[j]=0;
}
}
j=1;
for(i=1; i<=N; i++) //把素数存储入pn[N],下表从1开始
{
if(p[i])
{
pn[j++]=i;
}
}
}
int main()
{
int i,j,k;
int n;
prim_num();
while(scanf("%d",&n)!=EOF)
{
int flag=1;
for(i=2;i<N;i++)
{
if(n/2==pn[i])
{
k=i;
break;
}
if(n/2>pn[i]&&n/2<pn[i+1])
{
k=i;
break;
}
}
for(i=k;i>=0&&flag;i--)
{
for(j=i;j<N;j++)
{
if(pn[i]+pn[j]==n)
{
printf("%d %d\n",pn[i],pn[j]);
flag=0;
}
}
}
}
return 0;
}

浙公网安备 33010602011771号