标签:其他 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