poj 2262 Goldbach's Conjecture

#include <iostream>    
using namespace std;
int prime[100000],end;
bool test(int a)
{
if(a%2==0)
return false;
for(int i=3;i*i<=a;i+=2)
{
if(a%i==0)
return false;
}
return true;
}
void init()
{
int j=0;
for(int i=3;i<=1000003;++i)
{
if(test(i))
prime[j
++]=i;
}
end
=j-1;
}
int find(int n)
{
int b=0,e=end,mid=(b+e)/2;
while(!(prime[mid]<n&&n<prime[mid+1]))
{
if(n>prime[mid+1])
{
b
=mid+1;
mid
=(b+e)/2;
}
else
{
e
=mid;
mid
=(b+e)/2;
}
}
return mid;
}
int main()
{
init();
int n,s,i,j,tag;
while(cin>>n&&n)
{
s
=find(n);
tag
=0;
for(i=0;i<=s;++i)
{
for(j=s;j>=0;--j)
{
if(prime[i]+prime[j]<=n)
break;
}
if(prime[i]+prime[j]==n)
{
tag
=1;
printf(
"%d = %d + %d\n",n,prime[i],prime[j]);
break;
}
}
if(!tag)
printf(
"Goldbach's conjecture is wrong.\n"); //事实上不用打印这句,因为还未被证明Wrong
}
return 0;
}






//#include <iostream> //ac,水过,不用打素数表,直接一个个地试验直到找出结果
//using namespace std;
//bool prime(int a)
//{
// if(a%2==0)
// return false;
// for(int i=3;i*i<=a;i+=2)
// {
// if(a%i==0)
// return false;
// }
// return true;
//}
//int main()
//{
// int n,i;
// while(cin>>n&&n)
// {
// for(i=3;i<n;i+=2)
// {
// if(prime(i)&&prime(n-i))
// break;
// }
// printf("%d = %d + %d\n",n,i,n-i);
// }
// return 0;
//}

  

posted on 2011-07-22 14:59  sysu_mjc  阅读(123)  评论(0编辑  收藏  举报

导航