zoj 1657 || poj 2262 Goldbach's Conjecture

    技术2025-05-17  45

     

    zoj和poj这题居然还不是太一样。。不过做法都一样。

     

    先打素数表,开始我是弄了两重循环去判断是否想加等于i,后来想到,只要判断i-pre[k]是否是素数就好了,而这个表筛法已经筛出来了,答案很快就出来了,我也不用打表了。。。

     

    poj是把差值最大的两个加数输出,直接输出第一对即可。

     

    zoj

    #include <cstdio> #include <cstdlib> #include <iostream> #include <string.h> #include <queue> #include <limits.h> using namespace std; int pri[40000]; int p[50000]; int cou; void init() { cou = 0; memset(pri,0,sizeof(pri)); pri[0] = pri[1] = 1; int i,j; for(i=2; i<40000; i++) for(j=2; j*i<40000; j++) if( pri[i] == 0 ) pri[j*i] = 1; for(i=2; i<=32768; i++) if( pri[i] == 0 ) p[cou++] = i; } int num[40000]; int main() { init(); int i,j,k; int sum,n; for(i=4; i<=32768; i+=2) { sum = 0; for(k=0; k<cou && p[k] <= i/2; k++) if( pri[i - p[k]] == 0 ) sum++; num[i] = sum; } while( ~scanf("%d",&n) && n ) { printf("%d/n",num[n]); } return 0; }

     

     

    poj

    #include <cstdio> #include <cstdlib> #include <iostream> #include <string.h> #include <queue> #include <limits.h> using namespace std; int pri[1000005]; int p[500000]; int cou; void init() { cou = 0; memset(pri,0,sizeof(pri)); pri[0] = pri[1] = 1; int i,j; for(i=2; i<=1000000; i++) for(j=2; j*i<=1000000; j++) if( pri[i] == 0 ) pri[j*i] = 1; for(i=2; i<=1000000; i++) if( pri[i] == 0 ) p[cou++] = i; } int main() { init(); int i,j,k; int sum,n; while( ~scanf("%d",&n) && n ) { if( n % 2 == 1 ) { printf("Goldbach's conjecture is wrong./n"); continue; } for(k=0; k<cou && p[k] <= n/2; k++) if( pri[n - p[k]] == 0 ) break; printf("%d = %d + %d/n",n,p[k],n-p[k]); } return 0; }  

     

    最新回复(0)