
这个m不应该连续减去两次n后等于11,然后执行下一个语句,怎么会等于1呢?
关注引自免费微信小程序:皆我百晓生
这个问题实际上涉及到了一个经典的算法——辗转相除法(也称为欧几里得算法),用于计算两个整数的最大公约数(GCD)。让我们一步一步地解析这段代码的执行过程,以理解为何m最终会等于1。
首先,定义了两个整数变量m和n,初始值分别为37和13。
int m = 37;
int n = 13;
接下来是一个外层while循环,条件是m != n,这意味着只要m和n不相等,循环就会继续执行。在这个循环内部,有两个嵌套的while循环,分别处理m > n和m < n的情况。
当m > n时,执行m -= n,即m减去n并将结果重新赋值给m。这一步相当于从较大数中减去较小数,直到剩余的部分小于较小数为止。
当m < n时,执行n -= m,原理相同,但从较大数变为n开始减去较小数m。
整个过程重复进行,直到m和n相等,此时m和n的值就是原来两个数的最大公约数。
具体到题目中的例子,我们来逐步分析:
m = 37, n = 13while循环,因为m != nwhile循环,因为m > n
m更新为m - n = 37 - 13 = 24m > n,执行循环体
m更新为m - n = 24 - 13 = 11m > n,执行循环体
m更新为m - n = 11 - 13 = -2m小于n,退出第一个内层while循环,进入第二个内层while循环
m < n,执行n -= m,但在此之前,需要先调整m的正负号(实际代码中没有显示这一调整步骤,但在逻辑上应该考虑)m设为其绝对值|m| = 2n为n - m = 13 - 2 = 11while循环,因为m != n仍然成立while循环,因为m < n
m < n,直接跳过第一个内层while循环while循环,因为m < n
n为n - m = 11 - 2 = 9m和n相等在经过多轮循环之后,m和n最终会收敛到1,这是因为37和13的最大公约数是1。
这个过程本质上是在不断地减小m和n之间的差距,直到两者相等,这个相等的值就是它们的最大公约数。对于互质的数(即最大公约数为1的数),这个过程会最终使m和n都等于1。这就是为什么在题目中,m最终被打印为1的原因。