【C语言】判断素数的函数(完整代码)
素数在我们生活中的应用有很多,因此如何判断一个自然数是不是素数也就变得很重要了。 素数也叫质数,指大于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(" %d不是素数! ", n); break; //当前数能整除其他任意一个数,即表示非素数。跳出while循环 } i++; } if(i > sqrt(n)) printf(" %d是素数! ", 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(" %d不是素数! ", n); break; //当前数能整除其他任意一个数,即表示非素数。跳出while循环 } i++; } if(i > sqrt(n)) printf(" %d是素数! ", n); } int main() { int a = 9; // printf("请输入要判断的数:"); // scanf("%d", &a); is_prime(a); return 0; }
执行结果如下: