前言
近期学习C语言,发现了3种方法可以写出100–200之间的素数,且都在不断的优化。
提示:以下是本篇文章正文内容,下面案例可供参考
一、了解素数是什么?
素数就是质数,它的因数只有1和它本身,也就是说,只能被1和它本身整除,其他的数不能整除这个素数。
二、不同编写方法
1.依次循环判断
第一步:外层循环,我们先得到100–200之间的数
第二步:由于素数只能被1和它本身整除,那么我们可以判断除了1和它本身在(2,i-1)之间是否有数可以整除它,因此内层循环我们得到(2,i-1)之间的数字 t
第三步:判断 i 对 t 取余是否为0,如果等于0,说明这个i 有其他的因数;那么跳出循环,不用再往下判断(因为已经出现了一个别的因数,就已经不符合素数要求),跳出内层循环除了i 对 t 取余为0,第二个情况就是t 所有的数循环完之后,没有满足if条件的,就会跳出循环,此时t == i ,说明没有一个别的数能整除 i
第四步:跳出内层循环且还能满足下面if条件的,说明是第二种情况下跳出内层循环,此时就可以输出 i,得到素数。
int main() {
int i;
int t;
for (i = 100;i <= 200;i++) {
for ( t = 2;t < i;t++) {
if (i % t == 0) {
break;
}
}
if (i == t) {
printf("%d ", i);
}
}
return 0;
}
2.优化:利用开方,减少循环次数
这个优化主要是在内层循环上优化了。
那么为什么要这样做,举个例子:例如现在有个数是100,我们判断他是不是素数,那么就只用在2–10之间看是否有数能够整除100,因为100 = 10*10 ,如果一个10变大,必然有10减小了,总有一个因数是<= 10的。
因此对 i 开方 就可以减少循环次数,本来是2–99之间循环,现在是2–10之间循环,更简单一点。
另外,因为t 的范围变了,我们就不能用之前的i == t;我们可以设置一个falg,如果i 对t 取余等于 0,那么就 flag= 0,为假,退出循环,如果循环完了flag 还是初始值1 ,那么说明没有找到满足if条件的,我们就能得到素数。
代码如下(示例):
#include<math.h>
#include<stdio.h>
int main() {
int i;
int t;
int count = 0;
for (i = 100;i <= 200;i++) {
int flag = 1;
for ( t = 2;t <= sqrt(i);t++) {
if (i % t == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
count++;
printf("%d ", i);
}
}
printf("\n%d", count);
return 0;
}
3.直接对偶数过滤
这个相较于第二个方法,只改动了一句,但是算法的时间复杂度减少了不少,因为偶数不是素数(除了2),因此直接从奇数开始,每次+2,那么外层循环的循环次数就大大减少了一半。
#include<math.h>
#include<stdio.h>
int main() {
int i;
int t;
int count = 0;
for (i = 101;i <= 200;i+=2) {
int flag = 1;
for ( t = 2;t <= sqrt(i);t++) {
if (i % t == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
count++;
printf("%d ", i);
}
}
printf("\n%d", count);
return 0;
}
三、总结
求素数的方法还有很多,这里只是一小部分,大家多多练习,就能找到更多更简单的方法!