我们都知道素数就是只能被自身和1整除的数,当然0和1 除外;
为了判断一个数n是不是素数我们可以让n依次整除【2,n-1】区间的数,只要有一个能被n整除,则n不是素数。
代码如下:
int flag=0;
for(int i=2;i<n;i++){
if(n%i==0) flag=1;
}
if(flag) printf("不是");
else printf("是");
然而我们知道一个数的由两个数相乘得到时,一个数增大则另一个减小,所以只需要判断到i*i<n即可
int flag=0;
for(int i=2;i*i<n;i++){
if(n%i==0) flag=1;
}
if(flag) printf("不是");
else printf("是");
这增加了时间效率,但有一个一直没有解决的问题:n可能很大,i*i很可能溢出,我们要尽可能安全的计算,有的小机灵可能想到了,平方太大我们可以开方啊,You are right。
但是开放仍然有一个潜在的问题,sqrt函数参数是浮点类型的,浮点数在计算机中的运算是有误差的,所以这里用到了floor函数,他返回不超过参数的最大整数。
代码如下:
int flag=0;
for(int i=2;i<floor(sqrt(n)+0.5);i++){
if(n%i==0) flag=1;
}
if(flag) printf("不是");
else printf("是");
floor(sqrt(n)+0.5)//经常用来减少浮点数误差
这样我们知道怎样判断素数了,接下来让我们看看怎么求【0,1000000】之间的所有素数吧。