算法 数据结构-求两个数最大公约数,欧几里得算法

问题描述

求两个数最大公约数,欧几里得算法

求两个数最大公约数,欧几里得算法,这两种方法除第一种可以避免除数为零的情况,两者有什么区别?谢谢
public static int gcd(int p, int q)
{
if (q == 0) return p;
int r = p % q;
return gcd(q, r) ;
}

public static int gcd(int p, int q)
{
int r = p % q;
if (r == 0)
return q;
return gcd(q, r);
}

解决方案

第一种和第二种的区别就像
Do{ }While{}和Loop{}Until{}的区别一样
前者至少执行一次循环
而你这两个算法前者至少执行一次递归
比如说两个相同的非零数字 24和24
第二次可以直接得出r=0,然后return
第一次还要把r=0这个判断留到下次递归再进行

解决方案二:

第二种最大公约数包括自身

解决方案三:

第二个方法比第一个少一次递归调用,个人愚见。

解决方案四:

第二段代码是尾递归,换言之可以不用递归了。

解决方案五:

第1个除了第一次会避免除0外,其它都一样

解决方案六:

  • 第一种方法上来就判断除数是否为零。所以可以直接避免q=0的情况,但是当q=0的时候, p不是所需的解。
  • 第二种方法在取完余数后判断余数是否为零,一方面获得了解,另一方面也间接的解除了下一次辗转相除的除数为0的情况(因为下一次实际做的是q%r)。但是这种方法无法避免第一次的除数为0的情况。
时间: 2024-12-31 20:39:20

算法 数据结构-求两个数最大公约数,欧几里得算法的相关文章

C++ 全排序算法中交换两个数

问题描述 C++ 全排序算法中交换两个数 #include<iostream> using namespace std; void swap(int& a, int& b){ a = a + b; b = a - b; a = a - b; } void swap1(int&a, int& b){ int temp = b; b = a; a = temp; } void perm(int a[], int i, int n){ if(i == n - 1){

求两个数中的较大值max(a,b)。(不用if,&gt;)

题目:求两个数的较大值,不能使用if.>. 1.不使用if.>,还要比较大小,貌似就只能使用条件表达式: x=<表达式1>?<表达式2>:<表达式3>; (表达式1为true时,返回表达式2:否则返回表达式3)   2. 本题目中使用条件表达式: max(a.b)=<表达式1>? b:a; (表达式1为true时,返回b:否则返回a)   3.如何写表达式1,区分a与b的大小.(不用>) 可以使用位运算,判断a-b的符号位.符号位为1(负数

详解C语言求两个数的最大公约数及最小公倍数的方法_C 语言

求两个正整数的最大公约数       思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) (x >=y > 0).根据通式写出算法不难,这里就不给出了.这里给出<编程之美>上的算法,主要是为了减少迭代的次数.      对于x和y,如果y = k * y1, x= k * x1,那么f(x, y) = k * f(x1, y1).另外,如果x = p * x1,假

java操练之求两数最大公约数的两种算法思路

代码: 1 public class Hello { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 int a = 1112; 8 int b = 208; 9 int e = 546800; 10 int f = 256400; 11 int c = 1; 12 int min = (a < b ? a : b); 13 int min2 = (e < f ? e : f); 14 for(

求两个数中最大值,不用判断语句

#include "iostream.h" #include "math.h" #define bits ( sizeof( int ) * 8 - 1 ) static int CheckFlag( int x, int y ) { int s1 = x >> bits; int s2 = y >> bits; s1=abs(s1); s2=abs(s2); return ( s1 * 2 + s2 ); } static int Same

最古老的算法:辗转相除法(求两个自然数最大公约数)

在数学界,辗转相除法,又称欧几里得算法,被认为是世界上最早的算法(公元前300年),该算法用于求两个最大公约数的算法.辗转相除法首次出现于欧几里得的<几何原本>(第VII卷,命题yⅠ和Ⅱ)中,而在中国则可以追溯至东汉出现的<九章算术>. 两个自然数的最大公约数是能够同时整除它们的最大的正整数.辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约 数.例如,1254和390的最大公约数是6(1254 = 6 × 209:390 = 6 × 65):用

世界上最早的算法:辗转相除法(求两个自然数最大公约数)

      在数学界,辗转相除法,又称欧几里得算法,被认为是世界上最早的算法(公元前300年),该算法用于求两个最大公约数的算法.辗转相除法首次出现于欧几里得的<几何原本>(第VII卷,命题yⅠ和Ⅱ)中,而在中国则可以追溯至东汉出现的<九章算术>.     两个自然数的最大公约数是能够同时整除它们的最大的正整数.辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数.例如,1254和390的最大公约数是6(1254 = 6 × 209:390 =

两个数的最大公约数

一,两个数的最大公约数: 1.欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数.其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数,则 d | b , d |r ,但是a = kb +r 因此d也是(

算法实现-请教JAVA如何得到两个数 之前的最小比例

问题描述 请教JAVA如何得到两个数 之前的最小比例 比如 5:10 = 1:2 45:60 = 3:4 自己心算一下就算出来了,写函数完全没有办法,高手请帮帮忙! 解决方案 数学问题,求两个数的最大公约数问题.多个数的最小比例,就求多个数的最大公约数. 然后每个数字除以最大公约数,就是他们的简化比例.最大公约数可用辗转相除法. 解决方案二: public class Test { public static void main(String[] args) { minScale(60, 15)