POJ 2262
一道非常简单的题,重点在于检查一个数是否为奇数且质数。检查质数的时候我用打表的方式直接检查,用素数筛法进行打表,开始写的素数筛法效率很低,后来参考了下其他人的优化。我有一点难理解的是,这种从2倍开始,对于当前找到的所有素数,乘以倍数得到的数,将他们筛掉的方法为什么能够确保筛掉所有素数,并且最后控制被筛掉的数只被筛一次的条件也有些难以理解。记录在此,供今后研究。
#include<stdio.h> #define MAX_LIMT 1000000 int chk_odd(int); void make_prime(void); int prime[MAX_LIMT],recrd[MAX_LIMT]; int main() { int n; make_prime(); while(scanf("%d",&n)!=EOF&&n!=0) { int a=2,k=1; while(a<MAX_LIMT) { a=2*k+1; if(a>MAX_LIMT) break; if(chk_odd(n-a)&&prime[a]&&prime[n-a]) { printf("%d = %d + %d\n",n,a,n-a); break; } k++; } } return 0; } int chk_odd(int x) { if(x%2) return 1; else return 0; } void make_prime(void ) { int i,j,cnt=0; for(i=0;i<MAX_LIMT;i++) prime[i]=1; for(i=2;i<MAX_LIMT;i++) { if(prime[i]) recrd[cnt++]=i; for(j=0;j<cnt&&recrd[j]*i<MAX_LIMT;j++) { prime[i*recrd[j]]=0; if(i%recrd[j]==0) break; } } }