1+1猜想 II

来源:互联网 发布:在线对对联软件 编辑:程序博客网 时间:2024/05/29 08:57

FJNU.1759

Description
1+1猜想:
找出和为x(x为偶数,x>4)的两个素数

Input
第一行为数据组数N,
接下来N行,每行都有一个偶数x (4<x<=4294967294)

Output
输出为N行,输出和为x的两个素数。若有多组,输出绝对值之差最大的一组。

Sample Input
3
100
5526076
419911924

Sample Output
3 97
557 5525519
1583 419910341

My Program

#include<iostream>
#include
<math.h>
using namespace std;
const int N=65536;
bool prime[N];
int pr[N],l;
void getprime()
{
    
int i,j;
    
for(i=1;i<N;i++)
        prime[i]
=true;
    prime[
0]=false;
    i
=1;
    
while(i<N)
    
{
        
if(prime[i])
        
{
            j
=(i+1)*2;
            
while(j<N)
            
{
                prime[j
-1]=false;
                j
+=i+1;
            }

        }

        i
++;
    }

    l
=0;
    
for(i=1;i<N;i++)
        
if(prime[i-1])
        
{
            l
++;
            pr[l]
=i;
        }

}

  
bool isprime(unsigned long x)
{
    
if(x!=2&&x%2==0)
        
return false;
    
for(int i=1;i<l;i++)
        
if(pr[i]>=x)
            
break;
        
else 
            
if(x%pr[i]==0)
                
return false;
    
return true;
}
 

int main()
{
    
int n,j;
    unsigned 
long i,x;
    getprime();
    cin
>>n;
    
for(j=0;j<n;j++)
    
{
        cin
>>x;
        
for(i=2;i<=x;i++)
            
if(isprime(i)&&isprime(x-i))
            
{
                cout
<<i<<" ";
                cout
<<x-i<<endl;
                
break;
            }

    }

    
return 0;
}

YOYO's Note:
原来的从2~int(sqrt(n))一直TLE,无意间看到了大范围判断素数的方法(见函数库的《常用的数论算法》一文)。这次打的表是65536的,虽然AC了,依然花了0.80s…… 

原创粉丝点击