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


前言

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

三、总结

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

  • 25
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值