算法学习之欧几里得算法求解两个整数的最大公因子
2015-01-20 18:11
357 查看
总有一些伟大的数学家为一些数学问题提出高效的解决算法, 比如在求解两个整数的最大公因子上常用的欧几里得算法也叫辗转相除法,这里的除指的是取模。
算法的中文描述是两个整数的最大公约数是其中较小的一个数和他们两个之间的差的最大公约数。 我们可以理解为辗转相除实际上就是一步一步的消除两个数之间的共同部分,直到其中一个变为零,然后另外一个就是要求的那个公约数。
比如我们现在要求105和45的最大公约数m,两个数中较小的一个是45。也就是说,如果m能被45整除(45=m*a),也能被105整除。这说明肯定存在一个整数p使得105能分解为105=m*b = m*(a+p)=m*a + m*p=45 + m*p, 接着,m*p = 105-45。 也就是说两个数的差也能被m整除。
这个算法的c语言实现为:
算法的中文描述是两个整数的最大公约数是其中较小的一个数和他们两个之间的差的最大公约数。 我们可以理解为辗转相除实际上就是一步一步的消除两个数之间的共同部分,直到其中一个变为零,然后另外一个就是要求的那个公约数。
比如我们现在要求105和45的最大公约数m,两个数中较小的一个是45。也就是说,如果m能被45整除(45=m*a),也能被105整除。这说明肯定存在一个整数p使得105能分解为105=m*b = m*(a+p)=m*a + m*p=45 + m*p, 接着,m*p = 105-45。 也就是说两个数的差也能被m整除。
这个算法的c语言实现为:
#include <stdio.h> int ogdfunc(int op1, int op2) { int mem = 0;
<span style="white-space:pre"> </span>/* 参数正确性的检验 */ if(op1 <= 0 || op2 <= 0) { return -1; } if(op1 == op2) { return op1; } if(op1 > op2) { while(op2 > 0) { mem = op1 % op2; op1 = op2; op2 = mem; } return op1; } else { while(op1 > 0) { mem = op2 % op1; op2 = op1; op1 = mem; } return op2; } } int main(int argc, char *argv[]) { printf("maxval = %d\n", ogdfunc(20, 5)); return 0; }
相关文章推荐
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(1)
- 用欧几里得辗转相除法求任意两个整数的最大公因子(网上最快的算法!!!)
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
- 小白算法学习:求解两个字符串的最长公共子序列
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(2)
- 每天学习一算法系列(21)(输入两个整数n 和m,从数列1,..n 中随意取几个数使和等于m)
- 【算法导论学习-005】整数集合S中是否存在两个数等于给定的一个整数
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- 每天学习一算法系列(29)(有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小)
- 算法:求解,两个合适的整数间素数个数的问题
- 求两个整数的最大公因子 欧几里得算法(辗转相除法)
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(1)
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- 算法学习 - 不申请第三个数交换两个整数的值
- 每天学习一算法系列(27)(输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序)
- 编程求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包问题求解)
- 每天学习一算法系列(26)(输入一个整数,求该整数的二进制表达中有多少个1)
- [算法学习]将一个随机的整数转换成一个按各位上数值大小排序的整数
- 求两个整数的最大公约数,算法原理辗转相除法 原理: GCD (x,y) = GCD(y,x%y)
- 每天学习一算法系列(34)(求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数)