> 文章列表 > C语言判断素数的实现及数学原理

C语言判断素数的实现及数学原理

C语言判断素数的实现及数学原理

本篇博客会讲解如何使用C语言来判断一个整数是不是素数
C语言判断素数的实现及数学原理

实现方法

如何判断一个数是不是素数呢?如果这个数只能被1或者它自己整除,那么它就是一个素数。

如何写代码来判断呢?假设要判断一个数num是不是素数,就让2~(num-1)的数去试除num,如果整除了,就说明num除了1和它自己之外还有别的因数,自然就不是素数;反之,如果2~(num-1)都不能整除num,就说明num的因数只有1和它自己,此时num是素数。

具体的框架如下:

// 判断num是不是素数
for (int i = 2; i < num; ++i)
{if (num % i == 0){// 不是素数}
}
// if判断全为假,则是素数

我们把这个逻辑完善成一个函数:

bool IsPrime(int num)
{if (num <= 1)return false;for (int i = 2; i < num; ++i){if (num % i == 0)return false;}return true;
}

注意:使用布尔变量需要引用stdbool.h头文件。

是不是很简单?下面我们写一个代码,打印100~200之间的素数。

#include <stdio.h>
int main()
{for (int i = 100; i <= 200; ++i){if (IsPrime(i))printf("%d ", i);}return 0;
}

输出结果:
C语言判断素数的实现及数学原理

优化

其实,用不着用2~(n-1)的数去试除num。

类比一下,假设我想找出哪两个数加起来等于num,在这两个数中,一定有一个数小于等于num/2,另一个数大于等于num/2。这很好理解,如果两个数都比num的一半小,或者两个数都比num的一半大,它们的和是不可能与num相等的。

同理,我想找到哪两个数乘起来等于num,只需要拿2~num的算术平方根之间的数去试除num就行了。因为如果两个数乘起来等于num,一定有一个数比num的算术平方根小(或等于),另一个数比num的算术平方根大(或等于)。

C语言中使用sqrt这个函数来求算术平方根,这个函数的声明在math.h这个头文件中。

bool IsPrime(int num)
{if (num <= 1)return false;for (int i = 2; i <= sqrt(num); ++i){if (num % i == 0)return false;}return true;
}

总结

  1. 拿2~sqrt(num)的数去试除num,如果整除了就不是素数,反之就是素数。
  2. sqrt是用来求一个数的算术平方根的。

感谢大家的阅读!