关于素数判定的算法优化
2015-09-26 20:58
281 查看
素数的判断对于初学C语言的人来说,对循环语句的使用和算法的选择是一个非常好的锻炼。判断一个数是不是素数,即判断该数是否除了能被1和它本身整除外,不能被任何数整除。首先,想到的是从2开始进行除余,代码如下:
#include<stdio.h>void main(){int i,j;for(i=100;i<=200;i++){for(j=2;j<i;j++){if (i%j==0)break;}if(i==j)printf("%d\n",i);}}其次,对于这个算法还可进行优化。显而易见,偶数都是非素数。 所以,可以将所有的偶数舍去,只对奇数进行判定。而除的时候用1和2也没有多少意义,1除任何数都是可以整除的,而偶数已经被舍去除2也没有意义。优化后代码如下:
#include<stdio.h>int main(){int i,j;for(i=101;i<=200;i=i+2){for(j=3;j<i;j++){if(i%j==0)break;}if(i==j)printf("%6d",i);}return 0;}其实,这个程序优化到这一步还不是特别地好。试想,i必然是由两个数相乘而得,那么就不必从101一直除到200-1,可以直接从2到√i即可,这样大大地缩短了程序的运行时间。优化代码如下:
#include<stdio.h>#include<math.h>int main(){int i,j,k;for(i=101;i<=200;i=i+2){k=sqrt(i);for(j=3;j<k;j++){if(i%j==0)break;}if(j>=k)printf("%6d",i);}return 0;}通过对素数判定算法的优化,可以看出优化对于整个程序的时间复杂度有很大的提高,而优化对于一个程序也是至关重要的。在以后的学习中,不能拘泥于写出代码,运行没有问题就行了。而要一步一步去进行优化,使得其更加完美。
相关文章推荐
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- 在C语言中转换时间的基本方法介绍
- C语言进制转换代码分享