C语言 求100--200之间的素数

文章目录

  • 前言
  • 一、了解素数是什么?
  • 二、不同编写方法
    • 1.依次循环判断
    • 2.优化:利用开方,减少循环次数
    • 3.直接对偶数过滤
  • 三、总结


前言

近期学习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
#include
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
#include
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;
}

三、总结

求素数的方法还有很多,这里只是一小部分,大家多多练习,就能找到更多更简单的方法!

你可能感兴趣的:(c#)