素数知识我们很早都有所接触,学习了c语言,让我们来让写个素数判断小函数来感受速度与激情吧!!!
涉及知识 分支、循环
例:求出100~~200之间的素数
何为素数,就是仅仅之有1和它本身两个约数啦!!!
干!!!
/*思路:素数:即质数,除了1和自己之外,再没有其他的约数,则该数据为素数,具体方式如下*///方法一:试除法#include <stdio.h>int main(){int i = 0;int count = 0;// 外层循环用来获取100~200之间的所有数据,100肯定不是素数,因此i从101开始for(i=101; i<=200; i++){//判断i是否为素数:用[2, i)之间的每个数据去被i除,只要有一个可以被整除,则不是素数int j = 0;for(j=2; j<i; j++){if(i%j == 0){break;}}// 上述循环结束之后,如果j和i相等,说明[2, i)之间的所有数据都不能被i整除,则i为素数if(j==i){count++;printf("%d ", i);}}printf("\ncount = %d\n", count);return 0;}
上述方法的缺陷:超过i一半的数据,肯定不是i的倍数,上述进行了许多没有意义的运算,
让我们来优化下吧!!!
// 方法二:每拿到一个数据,只需要检测其:[2, i/2]区间内是否有元素可以被i整除即可,可以说明i不是素数int main(){int i = 0;//int count = 0;for(i=101; i<=200; i++){//判断i是否为素数//2->i-1int j = 0;for(j=2; j<=i/2; j++){if(i%j == 0){break;}}//...if(j>i/2){count++;printf("%d ", i);}}printf("\ncount = %d\n", count);return 0;}
方法二还是包含了一些重复的数据,
再优化下吧!!!
如果i能够被[2, sqrt(i)]之间的任意数据整除,则i不是素数原因:如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于sqrt(m),另一个大于或等于 sqrt(m)。方法三:#include <stdio.h>int main(){int i = 0;int count = 0;for(i=101; i<=200; i++){//判断i是否为素数//2->i-1int j = 0;for(j=2; j<=sqrt(i); j++){if(i%j == 0){break;}}if(j>sqrt(i)){count++;printf("%d ", i);}}printf("\ncount = %d\n", count);return 0;
还能再优化吗???
当然可以!!!
//方法四/*继续对方法三优化,只要i不被[2, sqrt(i)]之间的任何数据整除,则i是素数,但是实际在操作时i不用从101逐渐递增到200,因为出了2和3之外,不会有两个连续相邻的数据同时为素数*/#include <stdio.h>int main(){int i = 0;int count = 0;for(i=101; i<=200; i+=2){//判断i是否为素数//2->i-1int j = 0;for(j=2; j<=sqrt(i); j++){if(i%j == 0){break;}}//...if(j>sqrt(i)){count++;printf("%d ", i);}}printf("\ncount = %d\n", count);return 0;}
注:编者水平有限,如有错误,欢迎指正!!!