C语言 判断质数很简单

算法分析:假设对于一个正数a,如果a的约数只有两个,1和它本身,那这样数叫做素数。我们对a2a-1之间取余,如果还能找到第三个约数,使得余数为0,那a就不是素数,如果找不到第三个约数,使得余数不为0,那a就是素数。举个例子,如果a=5,我们判断5是不是质数,只要把5分别与2,3,4取余就好了。即在这个区间范围上,如果还能找到一个约数,使得余数为0,那么5就不是质数,否则,它就是质数。
代码如下:
在这里插入图片描述

#include	<stdio.h>
#include	<stdlib.h>
main()
{	system("color f4");
	int a=5;
	if(a%2==0||a%3==0||a%4==0)
	printf("a不是质数");
	else 
	printf("a是质数");

}

用上述的方法判断10以内的数很简单,但是如果用上述的办法判断1000呢?那不把人心态弄崩了?所以上述方法不具备普适性。那有啥普适性的方法来解决这个问题呢?先不说,先跟着我一步一步,循序渐进的学习。
优化01—先优化上述代码:优化的核心原因是根据开篇的算法分析,判断有没有第三个约数。
在这里插入图片描述

#include	<stdio.h>
#include	<stdlib.h>
main()
{	system("color f4");
	int a,count;
	a=5;
	if(a%2==0)
		count++;
	if(a%3==0)
		count++;
	if(a%4==0)
		count++;
	if(count==0)
		printf("质数");
	else
		printf("合数"); 

}

在上述代码中,我们增加了一个变量count来记录a有多少个约数。变量count的初始值为0。

当a % 2 == 0成立时,说明2是a的一个约数,此时count的值加1变为1。同理,当a % 3 == 0,a % 4 == 0也成立时,count值也加1变为3。最后我们通过变量count的值,知道了a有几个约数

同时可以判定a是否为正数。如果count到最后的值仍然是0,即之前的三个if条件语句都不成立,即a不能被2,3,4中的任意一个数整除,说明a除了1和本身之外,没有第三个约数了,此时a是质数。反过来,若count到最后的值不是0,说明之前的三个if条件判断语句中,至少有一个,最多有三个成立,此时a除了1和本身之外,仍然有第三个约数存在,a不是质数,是合数。
**优化02—**仍然可以优化上述代码,如下:
在这里插入图片描述

#include	<stdio.h>
#include	<stdlib.h>
main()
{	system("color f4");
	int a,count=0,i;
	a=5;
	for(i=2;i<=4;i++)//4+1-2来判断次数 
	{	if(a%i==0)
		count++;
	}
	if(count==0)
		printf("质");
	else
	printf("合数"); 
}

比较优化01和优化02,我们用

for(i=2;i<=4;i++)//4+1-2来判断次数 
	{	if(a%i==0)
		count++;
	}

来代替了

if(a%2==0)
		count++;
	if(a%3==0)
		count++;
	if(a%4==0)
		count++;

因为我们发现,这三个if语句只有变量值不一样,即2,3,4,其余都是一样的。变量值决定了我们的重复操作数,于是我们想到了用循环来解决。此时for隆重登场了!
更深一步思考,当a等于5的时候,只需要判断2,3,4是不是5的第三个约数(即2,3,a-1)。当a的值不确定的时候,我们需要将

for(i=2;i<=4;i++)//4+1-2来判断次数 

改为

for(i=2;i<=**a-1**;i++)//4+1-2来判断次数 

就可以判断任意正数a是不是质数了。代码如下:
在这里插入图片描述
在这里插入图片描述

#include	<stdio.h>
#include	<stdlib.h>
main()
{	system("color f4");
	int a,count=0,i;
	printf("请输入一个正整数:");
	scanf("%d",&a);
	for(i=2;i<=a-1;i++)//4+1-2来判断次数 
	{	if(a%i==0)
		count++;
	}
	if(count==0)
		printf("质");
	else
	printf("合数"); 
}

加一条printf();语句打印合数的约数。代码如下:
在这里插入图片描述

#include	<stdio.h>
#include	<stdlib.h>
main()
{	system("color f4");
	int a,count=0,i;
	printf("请输入一个正整数:");
	scanf("%d",&a);
	for(i=2;i<=a-1;i++)//4+1-2来判断次数 
	{		if(a%i==0)
		{	count++;
			
			printf("约数%d\n",i);
		}	
	}
	if(count==0)
		printf("质");
	else
	printf("合数"); 
}

类似的,再加一条语句,输出3~100间所有的素数。代码如下:
在这里插入图片描述

#include	<stdio.h>
#include	<stdlib.h>
main()
{	system("color f4");
	int a,i,c;
	for(a=3;a<=100;a++)
	{	for(i=2;i<=a-1;i++)//i++是什么时候加1? 
		{	if(a%i==0)
			break; 	
		}
		if(i==a)//最终的质数与最终的i是相等的。 
		printf("%d\n",i); 
	}
}

如果你认认真真地读完此文,并认真地上机操作,你就已经具备了判断任何一个正整数是不是质数的“降龙十八掌”了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码写注释

请赞赏我

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

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

打赏作者

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

抵扣说明:

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

余额充值