acm-最大公约数/最小公倍数 快速算法
2014-06-23 12:32
155 查看
方法一:欧基里德算法:
方法二更快:化归思想
#include <iostream> #include <fstream> using namespace std; int gcd(int, int); int main(int agrc, char*agvc[]) { int m, n; ifstream cin("a.txt"); while (cin >>m >>n) { cout << gcd(m, n) << endl; } system("pause"); return 0; } int gcd(int a, int b) { while (a != b) { if (a > b) a -= b; else b -= a; } return a; }
方法二更快:化归思想
/*tein 算法求最大公约数,和欧基里德算法相比,效果更好: 主要思想如下: 化归思想 1.m为奇数时: (1)n也为奇数:gcd(m,n) = gcd((m+n)/2,(m-n)/2) ; (2)n为偶数: gcd(m,n) = gcd(m,n/2) ; 2.m为偶数时: (1) n也为偶数:gcd(m,n) = gcd(m/2,n/2); (2) n为奇数: gcd(m,n) = gcd(m/2,n); 3.m == n 时,gcd(m,n) = m 退出 */ #include <cstdio> #include <iostream> using namespace std; int stein_gcd(int m, int n) { int temp, total = 0; if (m < n) { temp = m; m = n; n = temp; } if (n == 0) return 0; while (m != n) { if (m & 1) /* 如果m 为奇数, 因为奇数的后面总有一个1,所以可以通过与1且一下来判断是否是偶数*/ { if (n & 1) /* m,n都为奇数*/ { temp = m; m = (m + n) >> 1; n = (temp - n) >> 1; } else { n >>= 1; } } else /* m为偶数 */ { if (n & 1) /*n 为奇数*/ { m >>= 1; /*由于在这个过程中,m可能小于n ,所以要判断一下*/ if (m < n) { temp = m; m = n; n = temp; } } else { m >>= 1; n >>= 1; total++; /*记录缩小的倍数*/ } } } m <<= total; /*还原大小*/ return m; } int main(int agrc ,char* agrv[]) { int m, n, max = 0; while (cin >> m >> n) cout << stein_gcd(m, n) << endl; //printf("%d\n", max); return 0; }
相关文章推荐
- 南邮ACM 1015 最大公约数和最小公倍数 JAVA解法
- 求最大公约数和最小公倍数
- 最大公约数和最小公倍数问题--分解质因子
- wikioi1012 最大公约数和最小公倍数问题之枚举
- 求最大公约数和最小公倍数引发的一些问题
- 求最大公约数和最小公倍数
- 求最大公约数最小公倍数
- 11E求最大公约数和最小公倍数
- JS最大公约数和最小公倍数
- acm--最小公倍数(HDU 1108)
- PAT - 基础 - 最大公约数和最小公倍数
- 7-6 最大公约数和最小公倍数(15 分)
- 输写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
- 求最大公约数与最小公倍数
- 【程序6】 求最大公约数和最小公倍数
- C语言求最大公约数、最小公倍数
- 最大公约数最小公倍数 (例:HDU2028 Lowest Common Multiple Plus)
- 求两个数的最大公约数和最小公倍数
- C 语言 计算最大公约数和最小公倍数(辗转相除法和普通方法)
- 求最大公约数和最小公倍数