个人对素数的理解

首先,对于一个求100-200之间的素数,最初始的代码应该是这样的:

#include<stdio.h>
int main()
{
	//打印100-200之间的素数
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数
		int j = 0;
		for (j = 2; j < i; j++)
		{
   			if (0 == i%j)//i不是素数
   			{
   				break;
   			}
		}
		if(i == j)//到这里有两种可能,一种break跳出来的,不是素数;另一种是素数,即i和j相等
		{
			printf("%d ", i);
		}
	}	
	return 0;
}

代码优化,就是让计算机更轻松,让计算机使用更少的资源解决问题
因为素数肯定是奇数,所以素数不能被偶数整除,因此可以让j每次加2,而且j=1不能作为判断条件,所以可以让j从三开始

for (j = 3; j < i; j+=2)

这样可以节省一半的资源,而且因为素数是奇数,所以i也应该从奇数开始,并且每次加2

for (i = 101; i < 200; i+=2)

这样又可以节省一半的资源
因为一个数分解成两个数相乘,基本都是一个大一点的数字和一个小一点的数字,最相近就是两个相同的数字相乘,所以j≤i½,所以还可以这样改:

for (j = 2; j <= sqrt(i); j+=2)//sqrt()是库函数,用来开根号
//需要引头文件 #include<math.h>

这样又可以节省大部分的资源,这样修改也需要对下方的判断条件进行修改

if(j>sqrt(i))//如果i是素数,j出来的时候+2,肯定大于i½

这样出来的代码是

#include<stdio.h>
#include<math.h>
int main()
{
	//打印100-200之间的素数
	double i = 0;//因为sqrt计算的是浮点数,不能计算整形
	for (i = 101; i < 200; i+=2)
	{
		//判断i是否为素数
		int j = 0;
		for (j = 3; j < sqrt(i); j+=2)
		{
   			if (0 == (int)i%j)//i不是素数
   			//取模运算是整形运算符,所以这里将i强制转换成整形
   			{
   				break;
   			}
		}
		if(j>sqrt(i))//到这里有两种可能,一种break跳出来的,不是素数;另一种是素数
		{
			printf("%d ", (int)i);//这里需要将i转换成整形,不然打印出来的全是0
		}
	}	
	return 0;
}

最后的代码虽然比最初多写了几行,但是节省了绝大部分资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值