1. 程式人生 > >歐幾里得演算法(輾轉相除法)(c++實現)

歐幾里得演算法(輾轉相除法)(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.
//  Copyright (c) 2015年 chen. All rights reserved.
// #include <iostream> using namespace std; int gcd(int a, int b){ if (a%b == 0) { return b; } return gcd(b, a%b); } int main(int argc, const char * argv[]) { int a = 14, b = 18; printf("%d\n",gcd(a,b)); return 0; }

上面這個就是求的最大公約數的。其實通過這個也能求的最小公倍數。

非遞迴實現

鑑於有朋友說遞迴呼叫要耗費空間,這裡寫上非遞迴方法。

int gcd(int a, int b){
    int temp = a;
    while(a%b != 0){
        a = b;
        b = temp%b;
        temp = a;
    }
    return b;
}

雖然遞迴的方法更容易理解,但是非遞迴方法確實要省空間。不需要大量的壓棧操作。

最小公倍數

最小公倍數,就是a b的乘積除以它們兩個的最大公約數,就是它們的最小公倍數。程式碼如下:

int MinMultiple( int a, int b){
    return (a * b)/gcd(a, b);
}

這樣子就可以了。

相關推薦

演算法(輾轉除法)c++實現

歐幾里得演算法 歐幾里得演算法也叫輾轉相除法,是求兩個整數最大公約數的演算法。 當然也可以求最小公倍數。 演算法實現 其實演算法的實現原理就是,有整數a b兩個,每次求的一個數字r = a % b,然後把b放到a的位置,把r放到b的位置,遞迴呼叫。

演算法(輾轉除法求最大公約數程式碼

    求解最大公約數依據如下定理:gcd(a,b) = gcd(b,a mod b) (不妨設a>b 且r=a mod b ,r不為0); 兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數。 程式碼: 非遞迴演算法: int gcd(in

【擴充套件演算法輾轉除法

其計算原理依賴於下面的定理: 定理:兩個整數的最大公約數等於其中較小的那個數和兩數相除餘數的最大公約數。最大公約數(Greatest Common Divisor)縮寫為GCD。 /* 歐幾里德演算法:輾轉求餘 原理: gcd(a,b)=gcd(b,a mod b) 當b為0時,兩數的最

JAVA實現輾轉除法 演算法求逆

乘法逆元定義: 一般來講,如果要運算加法、減法、乘法、乘方,都應該滿足以下式子: (a+b)%c=(a%c+b%c)%c(a+b)%c=(a%c+b%c)%c (a−b)%c=(a%c−b%c)%c(a−b)%c=(a%c−b%c)%c (a⋅b)%c=(a%

演算法輾轉除法描述,證明和python實現

greatest common divisor 又稱輾轉相除法 演算法描述:給定兩個正整數m和n,求他們的最大公因子,即能夠同時整除m和n的最大正整數。 演算法步驟: 若m<n,那麼m↔n,為了確保m>n。 求m除以n得到的餘數r。 若r為0,演算法

Python程式碼筆記1輾轉除法/演算法求最大公約數gcdm,n

歐幾里得演算法求最大公約數:輾轉相除法 具體做法:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除除數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,

演算法,也稱輾轉除法,求公約數

#include <stdio.h> #include <stdlib.h> int main() { int a,b,r; printf("輸入兩個整數a,b:"); scanf("%d%d",&a,&

輾轉除法演算法java實現

輾轉相除法,又叫歐幾里得演算法,是用以計算兩個非負整數的最大公約數,在數學課本上是見過了,程式又是怎樣實現的。其實,只需4行。 計算兩個非負整數 p 和 q 的最大公約數:若q 是 0,則最大公約數為

JAVA實現輾轉除法 演算法求逆

public int niyuan(int a,int b) //求550關於模1769的乘法逆元 // 550*X(mod1769)=1 // niyuan(1769,550) { int[] m={1,0,a}; int[] n={0,1,b}; int[] temp=new

CFF 1028 判斷互質求最大公約數演算法輾轉除法

題目: 輸入兩個正整數m和n,判斷m和n是否互質(即最大公約數為1),是則輸出Yes,否則輸出No。 輸入輸出: 輸入兩個整數m和n,中間用空格隔開。 如互質輸出Yes,否則輸出No。 樣例: 36 56 No 7 9 Yes 資

C語言輾轉除/減法演算法求最大公約數和最小公倍數

#include <stdio.h> #include <stdlib.h> //題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 //採用任何兩種演算法來完成上述題目,並比較2種演算法的時間複雜度和空間複雜度。 int main() { int

【未完成】除法取模、逆元、擴充套件演算法

1.+,-,*都可以直接取模,但是除法不可以(模素數相當於換了數域,因為數域變成了有限域,有限域上沒有除法,要換成乘以逆元)。 2.除法取模要變成乘它的逆元。 a * x MOD m == 1則稱X為A關於模m的乘法逆元,其中a和m必須互素。 3.當m為素數時可以使用

演算法除法表示式

題意: 給出一個這樣的除法表示式:X1/X2/X3/···/Xk,其中Xi是正整數。除法表示式應當按照從左到右的順序求和,例如表示式1/2/1/2的值為1/4。但是可以在表示式中嵌入括號以改變計算順序

同餘定理演算法

如果  (a-b)%m==0  那麼 a%m==0  b%m==0 a,b關於模m同餘。   求最大公約數 #include "pch.h" #include<iostream> #include<cstdio> #include<

演算法 2018-10-18

歐幾里得演算法就是輾轉相除。 歐幾里得演算法和輾轉相除法都是求兩數最小公倍數的演算法。 所以,歐幾里得演算法(輾轉相除法)的重要程式碼如下: int gcd(int x,int y){ if(y==0) return x; else return gcd(y

UVA - 12169 -擴充套件演算法

#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #define ll long long #define rep(i,j,k) for(int i=j;

演算法複習——擴充套件演算法擴充套件,逆元,整除

①歐幾里得演算法 就是求gcd的有趣的輾轉相除法,不再贅述啦0v0 程式碼: int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } ②擴充套件歐幾里得演算法 需要解決這樣的問題:兩個非0整數a,b

奧賽-演算法-最大公約數

Greatest Common Divisor(GCD) 歐幾里得演算法據說是最早的演算法,用於計算最大公約數,也是數論的基礎演算法之一。   1.歐幾里德演算法的思想: 歐幾里德演算法的思想基於輾轉相除法的原理,輾轉相除法是歐幾里德演算法的核心思想,歐幾里德演算法說白了其實就是輾轉相除法的

實驗二 擴充套件演算法c++程式碼

#include<iostream> #include<stdio.h> using namespace std; int x,y,q; void extend_Eulid(int a,int b) { if(b==0) { x=1; y=0; q=a; }

拓展演算法模板

程式碼示例:求出ax + by = c的所有解 #include<cstdio> int exgcd(int a,int b,int& x,int& y){ if(b == 0){ x = 1,y = 0; return a; } int d = e