最大公约数
c++
最大公约数
/* 定理: 求解正整数 x, y 的最大公约数 gcd(x, y),等价于求解 gcd(y, x mod y) 证明: 使用分类讨论的方法证明: 当 x > y: gcd(x, y) = gcd(y, x % y) 证明: t = x % y = x - int(x / y) * y 对于 x, y, t 而言,我们讨论: 对于 x, y 均存在的约数,那么一定也是 t 的约数。 也就是说 t 和 y 的公约数,包含 x 的公约数。 对于 x 不存在,y存在的约数,t 一定不存在,因为 x = t + int(x / y) * y, 倘若 t 存在该约数,那么 x 一定存在,和假设不符。 也就是说 x 和 y 不存在的公约数,y t 一定不存在。 假设 存在约数 m 是 (y, t) 的公约数,但不是 (x, y) 的公约数,也就是说 m 是 y、t 的约数,但不是 x 的约数,和上面条件不符。 因此,(x, y) 的公约数集合 等于 (y, t) 公约数的集合。 gcd(x, y) = gcd(y, t) 当 x = y: gcd(x, y) == gcd(y, 0) 而因为 0 和 x 的最大公约数为 x,因此 gcd(y, 0) = y 当 x < y: gcd(x, y) = gcd(y, x % y) = gcd(y, x) 返回到情形 1 中。 最后因为 gcd(x, y) -> gcd(y, x % y) 是递减的,一定可以到 gcd(x, 0) 的递归终点。 */ #include <cstdio> #include <cstring> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <unordered_map> using namespace std; int n; int gcd(int x, int y) { if (y == 0) { return x; } else { return gcd(y, x % y); } } int main() { scanf("%d", &n); int x, y; while(n -- ) { scanf("%d%d", &x, &y); printf("%d\n", gcd(x, y)); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)