其实n不必被2~(n- 1)范围内的各整数去除,只须将n被2~n/2间的整数除即可,甚至只须被2~√n
之间的整数除即可。例如,判断17是否素数,只须将17被2, 3和4除即可,如都除不尽,n必为素
数。这样做可以大大减少循环次数,提高执行效率。为方便,可以定义一个整型变量k(其值为√n的整数部分); 如果n不能被2~k(即√n)之间的任一整数整除,则在完成最后一次循环后,i还要加1,因此i = k + 1, 然后才终止循环。在循环之后判别i的值是否大于或等于k + 1, 若是,则表明未曾被2~k之间任一整数整除过,因此输出“是素数”。
#include <stdio.h>
#include <math.h>
int main()
{
int n, i,k;
printf("请输入一个整数:\n");
scanf_s("%d", &n);
k = sqrt(n);
for (i = 2; i <= k; i++)
if (n%i == 0)
break;
if (i <= k)
printf("这不是素数\n");
else
printf("这是素数\n");
return 0;
}
算法如图:
程序改进参考 《C程序设计(第四版)》 谭浩强 著