素数在我们生活中的应用有很多,因此如何判断一个自然数是不是素数也就变得很重要了。
素数也叫质数,指大于1的自然数中,除了1和它本身外不再有其他因数的自然数,比如2、3、5、7、11、13……。
接下来,我就实现一个用来判断输入的数是不是素数的函数。
主要思想:
根据素数的特点“素数只能被1和自己整除“。
所以我们可以用2到n 依次除以n,若之间有能整除n的数存在,则当前数不是素数,否则是素数。
但其实用2到 sqrt(n)之间的数做除数就足够了,具体代码实现思路如下:
int i = 2; //素数可整除的最小数
while (i <= sqrt(n))
{
if (n%i == 0)
{
printf("\n %d不是素数!\n", n);
break; //当前数能整除其他任意一个数,即表示非素数。跳出while循环
}
i++;
}
if(i > sqrt(n))
printf("\n %d是素数!\n", n);
思考:为什么只需要循环到sqrt(n)的时候,就可以判断出是否为素数了呢?
这就需要用到数学知识推导了:
我们设n = sqrt(n)sqrt(n),再设n=xy(其中x>=y)
我们知道最小的非素数是4,即x=y=2=sqrt(4);然后是非素数6,即x=3>sqrt(6),y=2<sqrt(6)
由此我们发现,若当前数n是一个非素数,我们从2开始循环到sqrt(n)的时候,x,y中较小的除数y一定已经被找到了
如果我们继续循环比sqrt(n)大的数,无非就是找到y对应的另一个除数x。这毫无意义(如果想知道另一个除数x,可直接计算n/y)
故我们只需要循环到sqrt(n)即可判断出当前自然数n是否是素数
完整代码:
#include <stdlib.h>
#include <stdio.h>
# include<math.h>
void is_prime(int n)
{
int i = 2; //素数可整除的最小数
while (i <= sqrt(n))
{
if (n%i == 0)
{
printf("\n %d不是素数!\n", n);
break; //当前数能整除其他任意一个数,即表示非素数。跳出while循环
}
i++;
}
if(i > sqrt(n))
printf("\n %d是素数!\n", n);
}
int main()
{
int a = 9;
// printf("请输入要判断的数:");
// scanf("%d", &a);
is_prime(a);
return 0;
}
执行结果如下: