在编程之前,首先我们要了解素数的定义:在大于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; }
通过这样的优化一下子就会使我们的程序计算量减少一半,对提升程序的效率十分有效。
最后附上程序运行后的结果: