3 2 3 4
2
判断素数的题要说已经做过很多了,以前都是用打表的方法,这道题因为要求输入的数在int范围内,打表不能做。
第一种方法很普通,就是判断2到跟号n是否有n的约数,很好理解。
代码如下:
#include <stdio.h> #include <math.h> bool prime(int t) { if (t==2 || t==3 || t==5) return true; if (t<2) return false; for (int i=2;i<=sqrt((double)t);i++) { if (!(t%i)) return false; } return true; } int main() { int ans; int n; int t; while (~scanf ("%d",&n)) { ans=0; while (n--) { scanf ("%d",&t); if (prime(t)) ans++; } printf ("%d\n",ans); } return 0; }
下面的方法是在网上找到,个人觉得更好,如果理解了将会比上面的省时间,我为了方便自己理解,加了详细的注释,贴出学习学习:
#include <stdio.h> #include <math.h> int base[8]={4,2,4,2,4,6,2,6}; // 分析: //7 11 13 17 19 23 29 31 37 41 43 47 49 53 59 61 67 // 4 2 4 2 4 6 2 6 4 2 4 2 4 6 2 6 // 从7开始算加法,依次加42424626,可以得到所有质数 int prime(int t) { if (t<2) //0,1为非素数 return 0; if (t==2 || t==3 || t==5) //对小于7的素数单独判断 return 1; if (!(t%2 && t%3 && t%5)) //被2、3、5的倍数不为素数 return 0; //注意上述判断的先后顺序 int n=7; //从7开始加 for (;n<=sqrt(double(t));) { for (int i=0;i<8;i++) //从7开始列出素数判断 { if (t%n==0) return 0; n+=base[i]; } if (t%n==0) //之前少判断一次,所以单独判断 return 0; } return 1; //如果上述判断都通过,则为素数 } int main() { int ans; int n; int t; while (~scanf ("%d",&n)) { ans=0; while (n--) { scanf ("%d",&t); if (prime(t)) ans++; } printf ("%d\n",ans); } return 0; }