//10948 - The primary problem
#include <stdio.h>
#include <math.h>
#define M 1000005
#define MH M/2
int prime[80000];
char prm[M/16+10];
void seive();
int isPrime(int);
int main()
{
register int n,i,k=0,lim;
bool p;
//freopen("in.txt","r",stdin);
seive();
for(i=2;i<M;i++)
if(isPrime(i))
prime[k++]=i;
while(scanf("%d",&n)&&n)
{
lim=n>>1,p=false;
for(i=0;prime[i]<=lim;i++)
if(isPrime(n-prime[i]))
{
p=true;
break;
}
if(p)
printf("%d:\n%d+%d\n",n,prime[i],n-prime[i]);
else
printf("%d:\nNO WAY!\n",n);
}
return 0;
}
void seive()
{
int lim = (int)sqrt(M),i,j;
for ( i = 3; i <= lim; i += 2){
if ( !(prm[i>>4]&(1<<((i>>1)&0x7))) )
{
for (j = i*i/2; j <= MH; j+=i) prm[j>>3] |= (1<<(j&0x7));
}
}
}
int isPrime(int n)
{
if ( n < 2) return 0;
if ( n == 2) return 1;
if ( n%2 == 0) return 0;
if ( !(prm[n>>4]&(1<<( (n>>1)&0x7))) ) return 1;
return 0;
}
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.