怎么求最大公约数?
引言
有时需要求两数(\(a,b\))的最大公约数,即 \(\gcd(a,b)\)。
那怎么求?
原理
设 \(g=\gcd(a,b),a<b\)。
那么 \(a\) 是 \(g\) 的倍数,\(b\) 也是 \(g\) 的倍数,那么 \(m=b\bmod a=b-ka\) 也是 \(g\) 的倍数(\(k\) 是某个合适的整数,使 \(0\le m<a\))。
\(\because ka+m=b\)
\(\therefore\) 只要 \(a,m\) 是 \(g\) 的倍数,那么 \(b\) 也一定是 \(g\) 的倍数。
问题就转化为求 \(\gcd(m,a)=\gcd(b\bmod a,a)\)。由于 \(m\) 是模 \(a\) 的余数,所以 \(m<a\),满足条件“\(a<b\)”。
(说的不清楚请直接在评论区吐槽。)
最后如果 \(a=0\),返回 \(b\)。
实现
inline int gcd(int a,int b) { return (a?gcd(b%a,a):b);//等价于 return (b?gcd(a,a%b):a); }
ll gcd(ll x,ll y) { if(!x)return y; if(!y)return x; int xz=__builtin_ctzll(x),yz=__builtin_ctzll(y),sh=std::min(xz,yz); x>>=xz,y>>=yz; while(true) { if(y>x)std::swap(x,y); x-=y; if(!x)break; x>>=__builtin_ctzll(x); } return y<<sh; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具