最大公约数(Greatest Common Divisor)
穷举法
break语句
您可以在任何循环中使用break语句。
它导致程序执行到切换或循环后的下一条语句。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include<iostream> using namespace std; int main(){ int a,b,gcd; cout<<"input number: "; cin>>a>>b; gcd=min(a,b); while(gcd>1){ if(a%gcd==0 && b%gcd==0){ break; } gcd--; } cout<<gcd<<endl; return 0; } |
欧几里得算法(Euclidean Algorithm)
这段代码实现的是经典的,也称为辗转相除法,用于计算两个正整数的最大公约数(Greatest Common Divisor, GCD)。
你缺失的这一行代码应该是 b = r;。
完整代码实现
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <iostream> using namespace std; int main() { int a, b, r; cin >> a >> b;// 输入两个整数 while (b != 0) { r = a % b; // 取余数 a = b; // 将原来的除数作为新的被除数 b = r; // 将余数作为新的除数 } // 当除数 b 变为 0 时,此时的被除数 a 即为最大公约数 cout << a << endl; return 0; } |
逻辑解析
辗转相除法的步骤如下:
- 用 a 除以 b,得到余数 r。
- 把原来的 b 赋给 a,把刚才得到的余数 r 赋给 b。
- 重复上述过程,直到 b 等于 0 为止。
- 最后的 a 就是这两个数的最大公约数。
举个例子(计算 18 和 12):
- 第一轮:
a=18, b=12。18/12 = 1 余6。此时r = 6。执行后a = 12, b = 6。 - 第二轮:
a=12, b=6。12 /6 = 2 余 0。此时r = 0。执行后a = 6, b = 0。 - 循环结束: 此时
b为 0,输出a的值 6。
