栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】输出范围内所有素数时,时间复杂度优化问题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言】输出范围内所有素数时,时间复杂度优化问题

【C语言】输出范围内所有素数时,时间复杂度优化问题

素数:只能被1和它本身整除的数,也叫 质数

要输出范围内所有的质数,首先要给定范围,例:100 ~ 200 之间
由此,一般最外层循环条件为:

for(i = 100; i < 201; i++)

但是,偶数不可能是质数,所以可以进行第一次优化:

for(i = 101; i < 201; i += 2)				//i += 2  == i = i + 2
//由 奇数 加 2的方式 排除范围内所有偶数 

接下来判断 i 是否为素数,需用 i % 1 ~ i 之间的所有数:

int flag = 1;			//由标志变量 flag 是否为1 判断 i 是否为素数
for (n = 2; n < i; n++)			//2 ~ i-1
{
	if (i % n == 0)		//判断 i 是否可被其他数 整除
	{
		flag = 0;	//标志变量改变
		break;
	}
}	
if (flag == 1)		//若没被整除 则标志变量不改变 flag == 1   则 i 为素数 输出
{
	printf("%5d", i);
}

但是 , 如果一个数可以被另一个数整除 那么这个数就可以写成两数相乘的形式
例:195 == 1 *195 == 3 * 65 == 5 * 39 == 13 * 15
以 两数相乘 的形式 表示,则其中至少一个数 <= 这个数开平方
因为 一个数的平方根 是 此数约数(先这么看)的中位数
若还有其他约数 则一对约数 其中一数 一定小于这个数的平方根 对应的另一个约数 一定大于这个数的平方根
即 只要在 1 ~ 平方根 范围内 不能被整除 则 在 平方根 ~ 本身 范围内 也不可能被整除
所以,可以优化素数判断:

for (n = 2; n < sqrt(i); n++)			//sqrt() 开平方函数  在 math.h 库内
	{
		if (i % n == 0)
		{
			flag = 0;
			break;
		}
	}
	if (flag == 1)
	{
		printf("%5d", i);
		count++;
	}

OK 代码简单优化结束;
下面是 整个程序代码

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
//100 ~ 200 之间的素数

int main()
{
	int n = 0;
	int i = 0;
	int count = 0;
	printf(" 100 ~ 200 之间的素数有:n");
	
	for (i = 101; i < 201; i += 2)		//偶数不可能为素数 则 从奇数开始判断且  +=2
	{
		int flag = 1;
		//for (n = 2; n < i; n++)		//此 试 除  非最优
		//{
		//	if (i % n == 0)
		//	{
		//		flag = 0;
		//		break;
		//	}
		//}		
		for (n = 2; n < sqrt(i); n++)			
		{
			if (i % n == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
		{
			printf("%5d", i);
			count++;
			if (count % 5 == 0)			//利用 计数变量 每输出5个素数 换行
				printf("n");
		}
	}

	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290522.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号