求小于输入值的最大素数的代码

首先 我们先分析这个题目。

对于初学者而言,不难想出这个题要循环穷举来做。

第一步  我们先找到比输入值小1的数 及让他依次递减

int n;
scanf_s("%d",&n);//先输入n
for(int i=n-1;i>1;i++)//接着开始从比n小1的数开始进入循环

第二步 我们尝试写出判断质数的代码

for (int k = 2; k <= i / 2; k++)//这个循环来判断质数
		{
			if (i % k == 0)//进行举例  如果i能整除k 那么就不是质数
				c++;//不是质数的标志为c加1,这时候c就不等于0了
		}
		if (c == 0)//当c为0时 就说明对上面这么多k i都不能整除 说明i是质数
		{
			printf("%d", i);//输出这个质数
		}

第三步 开始看题目了 找出最大质数  显然我们已经到了最后一步

因为 前面的步骤 我们已经可以判断质数 并且可以找这个比n小的值

这时 我们就需要想想了  对于第一步的循环 我们是不是让他逐渐减小  减小的最大的质数就可以停止了呢

比如  我们输入n为50   他第一次循环进入的i为49  对于k来说 大到7的时候发现49%7==0  c就要+1了  c不为0  不输出这个数 进行下一次循环  i为48了  同上k为2的时候 48%2==0 进行下一次循环  

紧接着 i为47  这时候我们发现k的循环里面没有满足可以使c++的  所以c==0  我们找到了小于50的最大质数!!!

所以 我们不需要i继续减小了  可以结束i依次减小的循环了 那么怎么操作呢?

答案是找一个标志  当这个标志 满足某个条件时 可以跳出i的循环

所以 我们设立flag

for (int i = n - 1;; i--)//首先 我们先从小于n的数进行一个一个的操作
	{
		for (int k = 2; k <= i / 2; k++)//判断质数
		{
			if (i % k == 0)//进行举例  如果i能整除k 那么就不是质数
				c++;//标志为c!=0
		}
		if (c == 0)//当c为0时 说明是质数
		{
			printf("%d", i);//输出
			flag = 1;//让旗帜为1  其目的是为了构造跳出最外面那个for 因为这时候我们已经找到了这个质数
		}
		if (flag == 1)
			break;//跳出循环
	}

这样我们就完成到了这一步 但是你运行后发现不对 这是为什么呢?

经过监测后 我们发现原来第一次i的循环后 c的值就发生了变化!! 后续的值根本达不到c为0了 依旧是50的例子   第一次i为49  c不为0了  这是我们上面都承认了的  然后下一次循环开始时c不是从0开始的  也就是c只能增大 而永不为0  这样永远不能满足

if (c == 0)
		{
			printf("%d", i);}

也就是说 我们再也不能输出了

所以我们解决问题的方法就是 每一次循环开始的时候都让c为0 就可以完美解决这个问题

#include<stdio.h>
int main()
{
	int n, c = 0, flag = 0;
	scanf("%d", &n);
	for (int i = n - 1;; i--)//首先 我们先从小于n的数进行一个一个的操作
	{
		c = 0;//每次都要初始化
		for (int k = 2; k <= i / 2; k++)//然后这个来判断质数
		{
			if (i % k == 0)//进行举例  如果i能整除k 那么就不是质数
				c++;//标志为c!=0
		}
		if (c == 0)//当c为0时 说明是质数
		{
			printf("%d", i);//输出
			flag = 1;//让旗帜为1  其目的是为了构造跳出最外面那个for 因为这时候我们已经找到了这个质数
		}
		if (flag == 1)
			break;//跳出循环
	}
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值