ybq19513345431 2024-04-18 15:30 采纳率: 28.6%
浏览 2

求输入两数的最大公约数。不理解,为啥while的判断句中必须是c=a%b,不能是c,或者a%b,或者c!=0

#include<stdio.h>
int main()
{
    int a, b;
    int c = 0;
    scanf_s("%d %d", &a, &b);
    //int c = (a > b) ? a : b;
    c = a % b;
    while (c=a%b)//不理解,为啥while的判断句中必须是c=a%b,不能是c,或者a%b,或者c!=0
    {
        a = b;
        b = c;
    }
    printf("%d\n", b);
    return 0;
}

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-18 15:30
    关注

    引自免费微信小程序:皆我百晓生

    在计算两个整数的最大公约数(Greatest Common Divisor, GCD)时,我们通常采用欧几里得算法(Euclidean Algorithm)。在这个算法中,关键的一点是要不断更新两个数之间的关系,直到找到一个余数为零的情况。当余数为零时,较小的那个数就是最大公约数。

    在给定的C语言代码中,while循环的作用是不断执行以下步骤:

    1. 计算当前a除以b的余数,并将结果赋值给变量c
    2. 如果余数c不等于0,则继续循环。否则,跳出循环,此时b即为最大公约数。

    之所以写成 while(c=a%b),而不是其他形式,是因为这个表达式同时完成了两个操作:计算余数并将其赋值给c。这样做的好处是可以简化代码,减少不必要的中间步骤。

    让我们逐行分析这段代码:

    // 用户输入两个整数
    scanf_s("%d %d", &a, &b);
    
    // 初始化变量c为a和b中的较大值,这里已经注释掉,但实际应用中可以考虑保留这个初始化过程
    // c = (a > b) ? a : b;
    
    // 初始化c为a除以b的余数
    c = a % b;
    
    // 当余数不为0时,执行循环
    while (c=a%b)
    {
        // 更新a和b的值,使a变为原来的b,b变为原来的余数c
        a = b;
        b = c;
    }
    
    // 输出最大公约数b
    printf("%d\n", b);
    

    如果你对某个部分有疑问,或者想要更详细的解释,请随时告诉我。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月18日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。