首先,对于一个求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;
}
最后的代码虽然比最初多写了几行,但是节省了绝大部分资源