本篇博客会讲解如何使用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;
}
输出结果:
优化
其实,用不着用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;
}
总结
- 拿2~sqrt(num)的数去试除num,如果整除了就不是素数,反之就是素数。
- sqrt是用来求一个数的算术平方根的。
感谢大家的阅读!