标签:其他 sqrt math 了解 c语言 定义 设置 ges 函数
在编程之前,首先我们要了解素数的定义:在大于1的自然数中,除了1和它本身以外不再有其他因数。
因此,我们会最先想到一个方法:设100~200间的这个数是i,用i去分别除以2~(i-1)间的每一个数。
即:
#include<stdio.h>
int main()
{
int i, j;
for (i = 100; i <= 200; i++)
{
for (j = 2; j <= i-1; j++)
{
if (i%j == 0)
break;//如果能整除就跳出该次循环,避免多余运算
}
if (j==i)//该条件代表没有整除。
printf("%d ", i);
}
printf("\n");
system("pause");
return 0;
}
但是运用这种方法进行编程,会使代码过于繁琐,系统执行速度较慢,所以我们继续探究是否能将该代码进行优化。
这里有两种优化的方法:
第一种:因为i不可能整除比i/2更大的数,所以我们可以设置第3个变量t,用来存储i/2的值。
#include<stdio.h>
int main()
{
int i, j,t;
for (i = 100; i <= 200; i++)
{
t = i / 2;
for (j = 2; j <= t; j++)
{
if (i%j == 0)
break;
}
if (j>t)
printf("%d ", i);
}
printf("\n");
system("pause");
return 0;
}
第二种:相比于i/2,用t来储存i的平方根会更加优化这种算法。但这种算法需要引入新的头函数math.h,和新的函数sqrt()开方函数。
#include<stdio.h>
#include<math.h>
int main()
{
int i, j, t;
for (i = 100; i <= 200; i++)
{
t = sqrt(i);//开方函数
for (j = 2; j <= t; j++)
{
if (i%j == 0)
break;
}
if (j>t)
printf("%d ", i);
}
printf("\n");
system("pause");
return 0;
}
到这一步我们只是优化了内循环过程,我们还可以对外循环进行优化。
我们都知道100~200之间的偶数不可能是素数,因此我们可以人为的令i初始化为101,并每次循环时令其+2。
#include<stdio.h>
#include<math.h>
int main()
{
int i, j, t;
for (i = 101; i <= 200; i+=2)
{
t = sqrt(i);
for (j = 2; j <= t; j++)
{
if (i%j == 0)
break;
}
if (j>t)
printf("%d ", i);
}
printf("\n");
system("pause");
return 0;
}
通过这样的优化一下子就会使我们的程序计算量减少一半,对提升程序的效率十分有效。
最后附上程序运行后的结果:
标签:其他 sqrt math 了解 c语言 定义 设置 ges 函数
原文地址:http://www.cnblogs.com/xiefei777/p/7554083.html