首页 > 代码库 > 【编程之美】2.7求最大公约数
【编程之美】2.7求最大公约数
注:下面的解法中都没有考虑超大数,就是无法直接表示的数。如果有的话需要自己定义超大数,并定义相应的操作。
#include <stdio.h>//辗转相除法 缺点求余操作用到除法 非常耗时int gcd1(int x, int y){ return (!y) ? x : gcd1(y, x % y); //不需要大数在前,因为就算小一些的数字在前面 gcd一次后也变成大数在前了}//最大公约数可以同时被x 、y整除则 也可以被 x - y, y整除//缺点 循环次数很多int gcd2(int x, int y){ int a = (x > y) ? x : y; int b = (x < y) ? x : y; return (!b) ? a : gcd2(a - b, b);}//如果p是质数 x % p == 0 , y % p != 0 那么 gcd(x,y) = gcd(x/p, y);//2是质数 且除以2可以用移位操作//如果 x,y 都是偶数 gcd(x,y) = 2 * gcd(x>>1, y>>1);//如果 x是偶数,y是奇数 gcd(x,y) = gcd(x>>1, y);//如果 x是奇数,y是偶数 gcd(x,y) = gcd(x, y>>1);//如果 x,y 都是奇数 gcd(x,y) = gcd(x-y, y);//时间复杂度O(log2(max(x,y)))int gcd3(int x, int y){ if(x < y) return gcd3(y, x); if(y == 0) { return x; } else if(x & 0x0001 == 0) { if(y & 0x0001 == 0) return (gcd3(x>>1, y>>1) << 1); else return gcd3(x>>1, y); } else { if(y & 0x0001 == 0) return gcd3(x, y>>1); else return gcd3(x - y, y); }}int main(){ int r = gcd1(42, 30); int b = gcd2(42, 30); int c = gcd3(42, 30); return 0;}
【编程之美】2.7求最大公约数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。