~~~题目链接~~~
题目大意:给出一个数判断它是不是素数, 本题中1和2不是素数
简单题
code:
#include <stdio.h> #include <math.h> int is[16002]; int is_prime(int x) { int i = 0, j =(int)sqrt(x); for(i = 2; i<=j; i++) if(x%i == 0) return 0; return 1; } int main() { int i = 0, n = 0, count = 0; for(i = 3; i<=16000; i++) is[i] = is_prime(i); while(scanf("%d", &n), n>0) { printf("%d: ", ++count); if(is[n]) printf("yes\n"); else printf("no\n"); } return 0; }
筛选法
code:
#include <stdio.h> #include <math.h> #include <string.h> int main() { int i = 0, j = 0, n =0, count = 0, prime[16002]; for(i = 2; i<=16002; i++) if(i%2) prime[i] = 1; else prime[i] = 0; prime[1] = prime[2] = 0; for(i = 3; i<=sqrt(16002); i++) { if(prime[i] == 1) { for(j = i*i; j<=16002; j += i) prime[j] = 0; } } while(scanf("%d", &n) , n>0) { printf("%d: ", ++count); if(prime[n] == 1) printf("yes\n"); else printf("no\n"); } return 0; }
只存储奇数的筛选法 prime[0]判断的是3是否是素数, 依次类推每个i对应的为i*2+3
code:
#include <stdio.h> #include <math.h> #define max 16002/2 int main() { int i = 0, j = 0, n = 0, count = 0, prime[max]; for(i = 0; i<max; i++) prime[i] = 1; for(i = 0; i<=(sqrt(2*max+3)-3)/2+1; i++) { if(prime[i] == 1) for(j = (i*2+3)*(i*2+3); j<=2*max+3; j += i*2+3) if(j %2 == 0) continue; else prime[(j-3)/2] = 0; } while(scanf("%d", &n), n>0) { printf("%d: ", ++count); if(n%2 == 0) printf("no\n"); else { if(prime[(n-3)/2] == 1) printf("yes\n"); else printf("no\n"); } } return 0; }