3种方法!实现打印100-200之间的素数,带你打破思维限制

这里讲解了3种不同的实现打印100-200之间素数的方法,帮助你打破思维限制!

问题描述

写一个C语言程序打印100-200之间的素数

示例

image.png

方法1

思路分析

1.将100至200之间的数一个一个取出来,定义 i 存放取出的数
2.从2到 i-1 ,逐个尝试能否整除 i
3.如果能,则不是素数;如果否,则输出 i
4.继续判断下一个数,直到判断完100至200之间所有的数结束程序

代码实现

#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;

	for (i = 100; i <= 200; ++i)
	{
		//定义flag变量记录当前数是否为素数,假设是素数,变量值为1
		int flag = 1;

		for (j = 2; j < i; ++j)
		{
			if (i % j == 0)//遍历2到i-1
			{
				flag = 0;
				break;
			}
		}
		//如果flag等于1,则表明是素数,执行打印
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}

	return 0;
}

这个代码实现中将两个循环嵌套使用,外层循环遍历100至200之间的数,内层循环遍历2至当前外层循环取出的数(也就是 i ),然后在内层循环中使用一个分支判断能否整除。
其实素数还有个特点就是一定不为偶数,所以遍历时可以跳过偶数,只判断奇数是否满足素数的条件。不知道你有没有发现,上述方法1代码中其实也可以不借助变量flag来记录是否为素数,若想了解具体实现方法请看下面的方法2。

方法2

代码实现

#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;

	for (i = 101; i < 200; i += 2)//遍历时跳过偶数
	{
		for (j = 2; j < i; ++j)
		{
			if (i % j == 0)
			{
				break;
			}
		}

		//如果j等于i,说明上面的循环是因为不满足j<i导致循环结束的,
        //而不是执行到了break导致循环结束的
		if (j == i)
		{
			printf("%d ", i);
		}
	}

	return 0;
}

既然偶数不可能为素数,那我们就利用这个点来实现代码。我们将外层循环的 i = 100 改为了 i = 101,判断条件也不需要等于200了,因为不需要判断偶数嘛,很自然地完成,但是只改这两处可不行,因为我们是要让101至199之间只有奇数,实现这点也很简单,直接让 i 每完成一次循环后就自增2,这样就达到了目的。
这样做的好处是显而易见的,可以减少循环的次数,提高程序的执行效率。
在方法2中我们还做到了不借助变量flag来记录是否为素数,方法就是用是否满足 j == i 来判断打不打印 i ,j 不等于 i 则是break语句使内层循环结束,j 等于 i 就是素数了,执行打印。
这样做似乎使代码更加简洁,但是并不是所有的情况和方法都是可以直接break,不使用变量flag记录的,例如下面的方法3就必须要使用变量进行标记才可执行成功。

方法3

思路分析

1.当2至 i -1中存在某个数 k 可以整除 i 时,令 u = i/k,则 u 也可以整除 i ,并且结果为 k
2.当2至根号下 i 不存在可以整除 i 的数时,那么根号下 i + 1至 i 也不存在可以整除 i 的数

代码实现

#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
	int j = 0;

	for (i = 101; i < 200; i += 2)
	{
		//定义flag变量记录当前数是否为素数,假设是素数,变量值为1
		int flag = 1;

        //sqrt是求平方根的函数,包含在math.h中
		for (j = 2; j < sqrt(i); ++j)
		{
			if (i % j == 0)
			{
				flag = 0;//不是素数
				break;
			}
		}
 
		//如果flag等于1,则表明是素数,执行打印
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}

	return 0;
}

在此方法中运用了数学相关的知识来编写代码,其中使用了sqrt库函数,此函数是一个开平方的函数,包含在头文件math.h中,需要引入对应头文件才能调用此函数。
使用方法3的思路来实现相比于前两种更加高效,也就是算得更快,但相应也更难想出思路。

运行结果

以上3种方法都可运行成功,运行结果如下

image.png

总结

我们在完成打印100-200之间的素数这个程序总共用了3种不同的方法来实现,但是这三种方法实现的大体思路是相同的,都是利用了两个for循环进行嵌套遍历来实现打印。通过这3种方法有助于我们更好地理解编程,学习编程,不局限于某一种方法,帮助我们打破思维界限。
希望对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值