打印100到200中的素数的多种解法

    前话:作为初学者,多刷初学者应该刷的题是非常重要的,相同的题目也可能有不同的算法,算法的不同决定计算机的运算是否高效,先来学习下用多种解法来解“打印1到100中的素数”题。

   题目:按要求打印100到200中的素数。 

  • 第一种解法:先来最容易理解的第一种思路,在100到200中,只要能有被100到200中整除则该数不是素数,这里则需要用到两个循环,第一个循环来确定被除数,第二个循环来确定除数。我们可以设置flag来判断是否打印素数,flag=1则打印素数,flag=0则跳出第二个循环不打印素数,即判断下一个数是否为素数。代码如下:
    #include <stdio.h>
    int main()
    {
    	int i = 0;
    	int j = 0;
    	
    	for (i =100; i <= 200; i++)
    	{
    		int flag = 1;
    		for (j = 2; j <= i -1; j++)
    		{
    			if (i % j == 0)
    			{
    				flag = 0;
    				break;
    			}
    		}
    		if (flag == 1)
    		{
    			printf("%d ", i);
    		}
    	}
    	return 0;
    }

    第二种解法:思路:一个数一定可以被拆分为两个数相乘,例如16为4与4相乘或8和2相乘,由此我们可以发现,相乘之间的数字一定至少有一个数是小于或等于根号16,则得出一个结论:我们只需要将除数从2开始加到根号下的被除数即可,这运算效率远小于上一种解法。代码如下:

    #include <stdio.h>
    #include <math.h>;
    int main()
    {
    	int i = 0;
    	int j = 0;
    	
    	for (i =100; i <= 200; i++)
    	{
    		int flag = 1;
    		for (j = 2; j <= sqrt(i); j++)
    		{
    			if (i % j == 0)
    			{
    				flag = 0;
    				break;
    			}
    		}
    		if (flag == 1)
    		{
    			printf("%d ", i);
    		}
    	}
    	return 0;
    }

    第三种解法:思路:其实素数不可能是偶数,因为偶数一定能被2整除,因此我们可以从101开始每个数之间加个2避开偶数,那么需要被除的数又会减少了一半,是否对比第一种解法高效很多呢?代码如下:

    #include <stdio.h>
    #include <math.h>;
    int main()
    {
    	int i = 0;
    	int j = 0;
    	
    	for (i =101; i <= 200; i+=2)
    	{
    		int flag = 1;
    		for (j = 2; j <= sqrt(i); j++)
    		{
    			if (i % j == 0)
    			{
    				flag = 0;
    				break;
    			}
    		}
    		if (flag == 1)
    		{
    			printf("%d ", i);
    		}
    	}
    	return 0;
    }

    需要注意的是,一开始初始化flag的时候需要将flag=1放在第一个循环里头,因为若上一个数判断该数不是素数flag=0后进行下一个数判断则需要把flag重新赋值为1。

结果为 : 

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zjruiiiiii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值