首先 我们先分析这个题目。
对于初学者而言,不难想出这个题要循环穷举来做。
第一步 我们先找到比输入值小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;//跳出循环
}
}