C语言如何判断一个数是素数,输出100-200之间的全部素数。
2016-04-11 19:53
603 查看
素数又称质数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数。
我们知道如果一个数a不是素数,那么它一定可以看成是a/2之前的某个数的倍数,那么循环条件i的范围可以缩小为2到a/2。
因为如果一个数不是素数是合数,
那么一定可以由两个自然数相乘得到, 其中一个大于或等于它的平方根,一个小于或等于它的平方根。并且成对出现。那么这时循环条件i的范围可以缩小为2到sqrt(a),值得注意的是这里一定要包括sqrt(a),要不然计算结果会有遗漏。
在这里调用了库函数sqrt()来计算a的开方值,所以头文件要包含这个函数的库#include<math.h>。
#include<stdio.h> int Sushu(int a); int main() { int n = 0, res = 0; for (n = 100; n < 200; n++) { res = Sushu(n); if (res == 1) printf("%4d", n); } system("pause"); return 0; } int Sushu(int a) { int i = 0; for (i = 2; i < a; i++) { if (a % i == 0) return 0; //如果不是素数返回0 } return 1; //如果是素数返回1 }此时,素数判断函数里的循环条件i是从2到a,即这个数本身,显然这是没有必要的。因为要判断这个数是不是素数根本不用这么大范围的循环条件,可以一步步的缩小循环条件的范围,使程序更高效。
我们知道如果一个数a不是素数,那么它一定可以看成是a/2之前的某个数的倍数,那么循环条件i的范围可以缩小为2到a/2。
for (i = 2; i < a / 2; i++) { if (a % i == 0) return 0; }此时的程序效率要比之前的快一倍。然而我们还可以进一步提高它的效率。
因为如果一个数不是素数是合数,
那么一定可以由两个自然数相乘得到, 其中一个大于或等于它的平方根,一个小于或等于它的平方根。并且成对出现。那么这时循环条件i的范围可以缩小为2到sqrt(a),值得注意的是这里一定要包括sqrt(a),要不然计算结果会有遗漏。
for (i = 2; i <=sqrt(a); i++) { if (a % i == 0) return 0; }
在这里调用了库函数sqrt()来计算a的开方值,所以头文件要包含这个函数的库#include<math.h>。
相关文章推荐
- c++作业3
- Calling C and C++ from IDL (三) ——数组传递
- VS2013MFC对话框工程学习笔记八 - C++关键字(标识符)的学习
- C++学习之旅3种数据管理方式----自动存储、静态存储、动态存储
- 利用boost.python封装C++函数供python调用
- VS2013MFC对话框工程学习笔记七 - C++数据类型 - 整形 的简单学习
- VS2013MFC对话框工程学习笔记六 - 了解C++的数据类型
- 继承与派生
- C++ string 中 reverse()、assign()、split()
- c++作业3
- c++unique用法
- c++ 定义动态数组
- c++中关于SQLite中文乱码的解决方法
- C++ 函数后加const
- VC++ 实现文件与应用程序关联
- C++ int与string的转化
- C++头文件管理
- c++快速简易入门教程_011内联函数
- c++快速简易入门教程_010回调函数
- 【C/C++】计时函数比较