C语言练习---【求素数】

举报
春人. 发表于 2023/11/27 00:24:43 2023/11/27
【摘要】 🦖:什么是素数?素数又叫质数。素数,指的是“大于1的整数中,只能被1和这个数本身整除的数”。🦖:求解思路知道了什么是素数之后,我们就可以根据素数的特点来判断一个数是否为素数。既然素数只能被1和这个数本身整除,那要判断n是否为素数,我们就可以拿2~n-1的每一个整数去试除n,看余数是否为0,如果余数为0,说明n被整除,则n不是素数。如果2-n-1的所有整数去试除n余数都不为0,则说明n是素...

🦖:什么是素数?

素数又叫质数。素数,指的是“大于1的整数中,只能被1这个数本身整除的数”。

🦖:求解思路

知道了什么是素数之后,我们就可以根据素数的特点来判断一个数是否为素数。既然素数只能被1和这个数本身整除,那要判断n是否为素数,我们就可以拿2~n-1的每一个整数去试除n看余数是否为0,如果余数为0,说明n被整除,则n不是素数。如果2-n-1的所有整数去试除n余数都不为0,则说明n是素数。通过分析不难发现,要取到2-n-1的每一个整数,我们需要写一个循环。判断余数是否为0,需要用到求余符号’%'。知道了这些我们就可以来写代码了

🦖:求100-200的所有素数(代码实现)

#include <stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数
		int chag = 1;//假设是素数,注意chag的定义一定是在这里
		for (j = 2; j <=i-1; j++)//利用这个循环依次取到2-i-1的所有整数
		{
			if (i % j == 0)
			{
				chag=0;//如果i % j!=0说明果不是素数,让chag=0,此时i是否为素数判断完毕,可以终止这个循环,判断下一个数字是否为素数
				break;
			}
		}
		if (chag == 1)//如果i是素数,则程序不会进入上面的if语句,就不会执行chag=0;这条语句,所以chag的值还是最初假设的1,因此我们可以通过这里chag的值来判断i是否为素数
		{
			printf("%d ", i);
		}
	}
	return 0;
}

对chag的理解:

代码里定义了一个chag让它赋初值为1,并且假设i是素数,如果当程序判断出i不是素数重新把0赋值给chag,最终我们可以通过chag的值来看出i是否是素数。这里需要特别注意定义chag的位置,必须是在上面代码中的位置进行chag的定义。判断一个数是否为素数之前我们都先假设这个数就是素数,让chag=1;如果chag的定义不在这里,如果判断i不是素数,不是素数的话chag已经被重新赋值为0,如果chag的定义不在这里,那当判断第i+1个数是否为素数的时候chag最初的值就是0,这就会影响我们后面的判断,会导致判断结果出错。

🦖:程序优化

先给大家举个例子:我们都知道2×8=16。这说明16可以被2整除,也可以被8整除,被2整除得8,被8整除得2。因此当我们判断出2可以整除16以后,就无需再判断8是否可以整除16,因为通过数学知识,我们可以直接确定8一定能整除16。还有哪两个数相乘等于16呢?除了2×8=16以外,还有4×4=16。我们不难发现,当a×b=c的时候,a和b中一定有一个数字小于等于根号c,且当我们判断出a可以整除c以后,那b一定可以整除c。因此我们只需要判断2~根号c的所有整数是否可以整除c就可以,如果都不能整除说明c就是素数。反之c不是素数。

#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
	int j = 0;
	
	for (i = 100; i <= 200; i++)
	{
		//判断i是否为素数
		int chag = 1;//假设是素数
		for (j = 2; j <=sqrt(i); j++)//利用这个循环依次取到2-根号i的所有整数
		{
			if (i % j == 0)
			{
				chag=0;//如i % j!=0说明果不是素数,让chag=0,此时i是否为素数判断完毕,可以终止这个循环,判断下一个数字是否为素数
				break;
			}
		}
		if (chag == 1)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

🦖:程序进一步优化

我们很容易发现除了2,其他的偶数一定不是素数(至少可以被2整除)。素数只能是2或者奇数,但并不是所有的奇数都素数,因此我们只需要判断奇数是否是素数,无需对偶数进行判断(因为偶数一定不是素数),这可以大大帮助我们缩小判断范围。

因此求100-200的素数,我们可以从101开始判断,并且每次+2,101判断完以后判断103,然后判断105……直到199。这一下就把我们的判断范围缩小了一半。(注意:一定要从奇数开始判断,如果从偶数开始,那每次+2后得到的还是偶数,而除了2所有的偶数都不是素数。)

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

	for (i = 101; i <= 200; i+=2)//从101开始判断100-200之间所有的奇数是否是素数
	{
		//判断i是否为素数
		int chag = 1;//假设是素数
		for (j = 2; j <= sqrt(i); j++)//利用这个循环依次取到2-i-1的所有整数
		{
			if (i % j == 0)
			{
				chag = 0;//如i % j!=0说明果不是素数,让chag=0,此时i是否为素数判断完毕,可以终止这个循环,判断下一个数字是否为素数
				break;
			}
		}
		if (chag == 1)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

到这里,如何求解素数就讲解完了,,喜欢的话可以点赞、评论和收藏哟!

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。