基于C的素数计算小程序及优化

91 阅读1分钟

质数(英文名:Prime number)又称素数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。质数又称素数。


100~200之间的素数计算为例,通过以下C语言程序可以很容易地实现。需要包含头的文件有stdio.h

#include<stdio.h>

int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数
		//产生2~i-1的数字,去试除i
		int flag = 1;//假设i是素数
		for (int n = 2; n <= i - 1; n++)
		{
			if (i % n == 0)
			{
				flag = 0;//i不可能是素数
				break;
			}
		}
		if (flag)//是素数
		{
			printf("%d ", i);
		}
	}
	return 0;
}

接下来,为进一步优化程序,我们可以运用如下两条数学性质:

  1. 对于任意两个正实数ab,若a x b = c,则a ≤ √cb ≤ √c(即至少有一个数不超过√c)。如果在2~√c都没有找到能整除i的数,则i是素数。
  2. 偶数不可能是素数。

因此,修改内部for循环的判断条件为n <= sqrt(i);外部for循环为for (i = 101; i <= 200; i+=2)。需要包含头的文件有stdio.hmath.h

sqrt() 是 C 标准库math.h中的一个函数,用于计算一个非负数的平方根。

#include<stdio.h>
#include<math.h>

int main()
{
	int i = 0;
	for (i = 101; i <= 200; i+=2)
	{
		//判断i是否为素数
		//产生2~i-1的数字,去试除i
		int flag = 1;//假设i是素数
		for (int n = 2; n <= sqrt(i); n++)
		{
			if (i % n == 0)
			{
				flag = 0;//i不可能是素数
				break;
			}
		}
		if (flag)//是素数
		{
			printf("%d ", i);
		}
	}
	return 0;
}

如此一来,有效减少了内外层循环需要执行的次数。


正文完

参考资料:

(素数)baike.baidu.com/item/%E8%B4…

(C 库函数 - sqrt())www.runoob.com/cprogrammin…