(数论)51NOD 1106 质数检测
Posted ekalos-blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(数论)51NOD 1106 质数检测相关的知识,希望对你有一定的参考价值。
给出N个正整数,检测每个数是否为质数。如果是,输出"Yes",否则输出"No"。
Input
第1行:一个数N,表示正整数的数量。(1 <= N <= 1000) 第2 - N + 1行:每行1个数(2 <= S[i] <= 10^9)
Output
输出共N行,每行为 Yes 或 No。
Input示例
5 2 3 4 5 6
Output示例
Yes Yes No Yes No
解:先使用欧拉筛法找到(int)sqrt(1e9)+1=31623以前的所有质数,再使用这些质数判断之后数字的是否为质数。本题可以只找到5000以前的所有质数,但我觉得这么做不严谨。
1 #include <stdio.h> 2 #define MAXN 31623 3 4 int vis[MAXN], pri[MAXN], m = 0; 5 6 void phi() 7 { 8 vis[0] = vis[1] = 0; 9 for (int i = 2; i < MAXN; i++) 10 { 11 if (!vis[i]) pri[m++] = i; 12 for (int j = 0; j < m; j++) 13 { 14 if (i*pri[j] > MAXN) break; 15 vis[i*pri[j]] = 1; 16 if (i%pri[j] == 0) break; 17 } 18 } 19 return; 20 } 21 22 int main() 23 { 24 int n; 25 phi(); 26 while (scanf_s("%d", &n) != EOF) 27 { 28 while (n--) 29 { 30 int temp; 31 scanf_s("%d", &temp); 32 if (temp < MAXN) 33 printf("%s ", vis[temp]? "NO" : "YES"); 34 else 35 { 36 int flag = 0; 37 for (int j = 0; j < m; j++) 38 if (temp % pri[j] == 0) 39 { 40 flag = 1; 41 break; 42 } 43 printf("%s ", flag ? "NO" : "YES"); 44 } 45 } 46 } 47 }
以上是关于(数论)51NOD 1106 质数检测的主要内容,如果未能解决你的问题,请参考以下文章