欧几里得算法(辗转相除法)计算最大公约数

算法定义:

两个整数x和y且x>y的最大公因子等同于y与x mod y的最大公因子。

整数t整除x和y当且仅当t整除y和x mod y,因为x等同于x mod y 加上y的一个整数倍。

另:假设最后求解到的两个数的最大公约数是1,则认为两个数互素。

 1 /*递归算法*/
 2 int gcd_rec(int m, int n)
 3 {
 4     if (n == 0)
 5         return m;
 6     return gcd_rec(n, m % n);
 7 }
 8
 9
10 /*迭代算法*/
11 int gcd_iter(int m, int n)
12 {
13     while (m % n != 0)
14     {
15         int mod = m % n;
16         m = n;
17         n = mod;
18     }
19
20     return n;
21 }
时间: 2024-08-01 22:43:43

欧几里得算法(辗转相除法)计算最大公约数的相关文章

欧几里得算法——求取最小公约数

1 import java.util.Scanner; 2 3 /** 4 * Created by Administrator on 14-5-20. 5 */ 6 public class Euclid { 7 public static void main(String[] args){ 8 Scanner scanner=new Scanner(System.in); 9 String str=scanner.nextLine(); 10 int a=Integer.parseInt(s

算法学习 - 欧几里得算法(辗转相除法)(c++实现)

欧几里得算法 欧几里得算法也叫辗转相除法,是求两个整数最大公约数的算法. 当然也可以求最小公倍数. 算法实现 其实算法的实现原理就是,有整数a b两个,每次求的一个数字r = a % b,然后把b放到a的位置,把r放到b的位置,递归调用. 就是gcd(a, b) { return gcd(b, a%b); }这个样子的. 结束条件是当 a%b == 0的时候停止. 最大公约数 // // main.cpp // Euclidean // // Created by Alps on 15/3/28

欧几里得算法--辗转相除法

今天在做一个很简单的算法题目,“求最大公约数和最小公倍数”.一看,太tm容易. 思考过程是这样的: 1.最大公约数,有两个个极端,一个是最大公约数是1,一个最大公约数是两个数之间较小的那个数. 2.我就理所当然地认为,so easy.不就一个for循环吗?从较小的那个数到1的这一段范围就,如果其中一个数能被较大的数整除不就ok罗,然后返回到那个数,不就得到最大公约数啦. 3.然后兴致冲冲地写下下列的代码 public static void commonDivisor(int n,int m)

欧几里得算法(求最大公约数)

1 //求两个数的最大公约数 2 #include<iostream> 3 using namespace std; 4 int f(int m,int n) 5 { 6 if(n==0) 7 return m; 8 else 9 return f(n,m%n); 10 } 11 int main(){ 12 int a,b; 13 int temp; 14 cin>>a>>b; 15 if(a<b) 16 { 17 temp=a; 18 a=b; 19 b=te

欧几里得算法_求最大公约数

自然语言描述 计算两个非负整数p和q的最大公约数: 若q=0,则最大公约数是p.否则,将p除以q得到余数r,p和q的最大公约数即为q和r的最大公约数 java语言描述 public static int gcd (int p,int q){ if(q==0) return p; int r =p%q; return gcd(q,r); }

求最大公约数的欧几里得算法与其伪代码

最大公约数的欧几里得算法 a,b最大公约数(Greatest Common Divisor),就等于b,a%b的最大公约数,公式如下 gcd(a,b)=gcd(b,a%b) gcd(a,b) = gcd(b,a % b) gcd(a,b)=gcd(b,a%b) 摘自 欧几里得算法(求解最大公约数的优质方法)以及原理拓展 用伪代码实现此算法 Begin 输入 A,B A对B取余,结果赋值为R 若R=0,则B是最大公约数 若R不等于0,则以B为A,以R为B循环上一步 手动检测运算截图 原文地址:ht

python常用算法(6)——贪心算法,欧几里得算法

1,贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的的时在某种意义上的局部最优解. 贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解.要会判断一个问题能否用贪心算法来计算.贪心算法和其他算法比较有明显的区别,动态规划每次都是综合所有问题的子问题的解得到当前的最优解(全局最优解),而不是贪心地选择:回溯法是尝试选择一条路,如果选择错了的话可以“反悔”,也就是回过头来重新选择其他的试试. 1.1

bzoj3817 Sum 类欧几里得算法

这道题目solution写了两种做法,都讲一下吧. 首先,令x=r^0.5,显然,如果x>2,则可以不断减2到小于二:如果x>1,那么变为2-x.因此此时必有x<1.(特判r为完全平方数的情况).那么令y=1/x,则: 题目等价于在数轴从0~n,以y长度为一个区间(左闭右开)黑白交替染色,求黑色部分覆盖的整点减去白色部分覆盖的整点.然后把最后面零散的部分暴力计算,如果最后一个是黑色的也暴力计算.那么这个时候黑白段数相等,且每一段黑(白)都至少覆盖[y]个点恰好各自抵消[y],那么将每一段

c语言求两个数的最大公因数(穷举法,欧几里得算法,递归)

/*主函数Gcd为求公因数的函数输入为负时返回-1*/ int main(){   int a, b;  printf("Input a,b:");  scanf("%d,%d",&a,&b);  if (a < 0 || b < 0)   printf("Input number should be positive!\n");  else  printf("Greatest Common Divisor