900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C语言之素数求解

C语言之素数求解

时间:2018-07-30 15:31:51

相关推荐

C语言之素数求解

素数知识我们很早都有所接触,学习了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;}

注:编者水平有限,如有错误,欢迎指正!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。