AOJ 0056: Goldbach's Conjecture
できるだけ、実行時間を短くしてみようとしました。コードも少しだけ短めにしました。
偶数を除いて普通にエラトステネスの篩を使って、(素数+素数)を全部計算しただけですが、可読性のことは全く考えていません。ごめんなさい。
あと、if文って結構時間が掛かるみたいですね。
#include <cstdio> int P[25000],G[50001],i,j;//P[i]=prime[2*i+1] int main(){ for(i++; i < 25000; i++){ if(!P[i]){ for(j = i*3; j < 24999; j += i<<1){ P[++j]=1; } } } G[4]++; for(j = 1; j < 24999; j++){ G[2*j+3]+=(!P[j]); } for(i = 1; i < 25000; i++){ if(!P[i]){ for(j = i; j < 25000-i; j++){ G[(i+j+1)<<1]+=(!P[j]); } } } while(std::scanf("%d",&i),i){ std::printf("%d\n",G[i]); } return 0; }