判断一个数n是否为素数(prime)的方法:
基本算法:让n被i除(i的值为从2到n-1),如果n能被2~(n-1)的任一个整数整除,则表示n肯定不是素数,因此,可以提前结束循环。此时i的值必然小于n。
#include<stdio.h>
int main()
{
int n, i;
printf("please enter a integer number, n=?");
scanf("%d", &n);
for (i = 2; i < n; i++)
if (n % i == 0) break;
if (i < n)
printf("%d is not a prime number.\n", n);
else
printf("%d is a prime number.\n", n);
return 0;
}
判断n是否为素数,关键是看循环时的i的值是否小于n,如果n能被2~(n-1)的一个整数整除,则必然时由break语句导致循环提前结束,即i并未达到n的值就终止循环了。显然此时i < n 。因此,只要在循环结束后检查循环变量i的值,就能判定n是否是素数了。
算法改进:其实n不必被2~(n-1)的各整数去除,只须将n被2~n/2的整数除即可,甚至只须被2~的整数除即可。因为n的每一对因子,必然有一个小于
,另一个大于
。例如,判断17是否为素数,只须将17被2,3和4除即可,如都除不尽,n必为素数。
为方便,可以定义一个整形变量k(其值为的整数部分);如果n不能被2~k(即
)的任一整数整除,则在完成最后一次循环后,i还要加1,因此i=k+1,然后才终止循环。在循环后判定i的值是否大于或等于k+1,若是,则表明未曾被2~k任一整数整除过,因此输出该数是素数。
#include<stdio.h>
#include<math.h>
int main()
{
int n, i, k;
printf("please enter a integer number:n=?");
scanf("%d", &n);
k = sqrt(n);
for (i = 2; i <= k; i++)
if (n % i == 0) break;
if (i <= k)
printf("%d is not a prime number.\n", n);
else
printf("%d is a prime number.\n", n);
return 0;
}
有了上文的基础,求100~200的全部素数就不困难了,只要增加一个外循环,先后对100~200的全部整数一一进行判定即可。
#include<stdio.h>
#include<math.h>
int main()
{
int n, k, i, m = 0;
for (n = 101; n <= 200; n = n + 2)
{
k = sqrt(n);
for (i = 2; i <= k; i++)
if (n % i == 0) break;
if (i >= k + 1)
{
printf("%5d", n);
m = m + 1;
}
if (m % 10 == 0)
printf("\n");
}
printf("\n");
return 0;
}