1. 程式人生 > >歐幾里得演算法和擴充套件歐幾里得演算法的簡單例子

歐幾里得演算法和擴充套件歐幾里得演算法的簡單例子

歐幾里得演算法:

#include <cstdio>
#include <cstdlib>

/*
*   挑戰。。。p113
*/

struct point{   //格點
    int x;
    int y;
};

point p1, p2;   //兩個格點

int gcd(int a,int b){   //歐幾里得演算法
    if(b == 0) {
        return a;
    } else {
        return gcd(b, a % b);
    }
}

void solve(){
    int px = abs(p1.x - p2.x);  //兩格點的x座標距離
    int py = abs(p1.y - p2.y);  //兩格點的y左邊距離
    int res = 0;
    if(px != 0 && py != 0){
        res = gcd(px, py) - 1;
    }
    printf("%d\n", res);
}


int main(){
    while(scanf("%d%d%d%d", &p1.x, &p1.y, &p2.x, &p2.y) != EOF){
        solve();
    }
    return 0;
}

擴充套件歐幾里得演算法:

#include <cstdio>

/*
*   挑戰程式設計競賽 p115
/*

//思路:
//擴充套件歐幾里得演算法是在歐幾里得的演算法基礎上求解模線性方程及方程組
//已知ax + by = 1,gcd(a, b) = 1
//所以ax + by = gcd(a, b) ①
//再輾轉相除一次後,①變為②
//bx + (a % b)y = gcd(a, b) ②
//a % b = a - (a / b) * b ③
//將③代入②得到④
//bx + (a - (a / b) * b)y = gcd(a, b) ④
//將④化簡為⑤
//ay + b(x - (a / b) * y) = gcd(a, b) ⑤

//當b = 0時,顯然有 a = gcd(a , b),這時 x = 1, y = 0
//總之,有如下幾個等式
// 當 b = 0 時,x = 1, y = 0
// 其他情況 x = y, y = (x - (a / b) * y)

int a,b;
int x,y;
int extgcd(int a, int b, int &x, int &y){ //擴充套件歐幾里得演算法
    if(b == 0){
        x = 1;
        y = 0;
        return a;
    } else {
        int r = extgcd(b, a % b, x, y);
        int t = x;
        x = y;
        y = t - (a / b) * y;
        return r;
    }
}

void solve(){
    int res = extgcd(a, b, x, y);
    if(res != 1){
        printf("-1\n");
        return;
    }
    if(x > 0){
        printf("%d0", x);
    } else {
        printf("0%d", -x);
    }
    if(y > 0){
        printf("%d0\n", y);
    } else {
        printf("0%d\n", -y);
    }
}

int main(){
    while(scanf("%d%d", &a, &b) != EOF){
        solve();
    }
}


相關推薦

演算法擴充套件演算法簡單例子

歐幾里得演算法: #include <cstdio> #include <cstdlib> /* * 挑戰。。。p113 */ struct point{ //格點

LG 的數學計劃 ---- 第三步 演算法擴充套件

於是,我們在完成神奇的前兩步之後,來到了這個神奇的地方——歐幾里得演算法和擴充套件歐幾里得演算法。 那麼,這是用來幹什麼的演算法呢? 算最大公約數(GCD)~~~ 好吧,考慮到有一些同學可能還不知道這是怎樣一種神奇的東西,那麼我就把這個東西的定義放到下面來

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

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

擴充套件!!!

歐幾里得: 是求兩個數的最大公約數: int gcd(int a, int b) { if(b==0) return a; return gcd(b, a%b); } 擴充套件歐幾里得: 已知a, b求解二元一次方程ax+by =gcd(a, b)的一

演算法學習(一)——演算法&擴充套件演算法

最大公約數/歐幾里德演算法(gcd) 歐幾里德演算法又稱輾轉相除法,證明可以度娘。 個人簡單腦部就是a和b兩個數的模還是a和b的最大公約數 int型別  int gcd(int a, int b) {return a%b==0?b:gcd(b,a%b);} long l

【專題】演算法擴充套件、乘法逆元

1.歐幾里得 用途 最大公因數和最小公倍數 定理:  gcd(a,b)=gcd(b,a%b)   證明: 我們令c=gcd(a,b) 令a=n∗c , b=m∗c a%b=a−k

gcd演算法/extgcd擴充套件演算法以及在解不定方程中的應用

這個應該是我在noip前就應該會的東西 ,但是當時也許只是記下了程式碼吧 ,現在有諸多的不理解。後來藉著書和幾篇部落格弄懂了並小證了一下,鑑於網上有些部落格關於這個的寫的真的不好看,所以自己來總結一下,順帶以後也能看。 順帶一提,gcd(a,b)表示a,b的最

#數論# 演算法擴充套件演算法 、費馬小、逆元求解(ing)

歐幾里德求gcd(輾轉相除法): 定理: gcd(a, b) = gcd(b, a % b) 兩個正整數a和b(a>b),它們的最大公約數等於a除以b的餘數c和b之間的最大公約數 證明: a可以表示成a = kb + r,則r = a %

演算法擴充套件演算法、乘法逆元

最近看了一本書《程式設計師》裡面說的一個面試題: 求兩個數的最大公約數: SoEasy的題目看過C 的人都知道怎麼寫這個程式 1.傳統方法:窮舉 #include <math.h>int main(){int m=1970,n=1066,p=0;p=m<n?m:n;for(;p>=1

最小生成樹演算法:普演算法克魯斯卡爾演算法

普里姆演算法—Prim演算法 演算法思路:  從已選頂點所關聯的未選邊中找出權重最小的邊,並且生成樹不存在環。 其中,已選頂點是構成最小生成樹的結點,未選邊是不屬於生成樹中的邊。 (普里姆演算法與求最短路徑的迪傑斯塔拉演算法思想很類似)   下面我們對下面這幅

負載均衡的演算法快取的種淘汰策略

一、負載均衡演算法 1、輪詢法   將請求按順序輪流地分配到後端伺服器上,它均衡地對待後端的每一臺伺服器,而不關心伺服器實際的連線數和當前的系統負載。 2、隨機法 通過系統的隨機演算法,根據後端伺服器的列表大小值來隨機選取其中的一臺伺服器

最小生成樹---普演算法(Prim演算法)克魯斯卡爾演算法(Kruskal演算法

      **最小生成樹的性質:MST性質(假設N=(V,{E})是一個連通網,U是頂點集V的一個非空子集,如果(u,v)是一條具有最小權值的邊,其中u屬於U,v屬於V-U,則必定存在一顆包含邊(u,v)的最小生成樹)** # 普里姆演算法(Pri

最小生成樹演算法普利姆演算法克魯斯卡爾演算法實現

最小生成樹演算法: 普里姆演算法:頂點集合N,輔助頂點集合S,初始化中,將出發點vi加入S,並從N中刪除 1.從頂點集合N中找到一條到集合S最近的邊(vi,vj),儲存該邊,並將vj從N移到S中 2.重複1步驟直至所有頂點加入S集合 普里姆演算法:與邊的多少關係不大,適合計算邊稠密的圖

最短路徑演算法:克魯斯卡爾演算法迪傑斯特拉演算法(天勤資料結構高分筆記)

迪傑斯特拉演算法演算法思想:     設有兩個頂點集合S和T,集合S存放途中已經找到最短路徑的頂點,集合T存放的是途中剩餘頂點。初始狀態是,集合S只包含源點V0,然後不斷從集合T中     選取到頂點V0的路徑長度最短的頂點Vu併入到初始集合中。集合S每併入一個新的頂點Vu,

最小生成樹(Dijkstra)演算法最短路(Prim)演算法的異同

Prim演算法用於構建最小生成樹——即樹中所有路徑之和最小,但不能保證任意兩點之間是最短路徑。例如,構建電路板,使所有邊的和花費最少。只能用於無向圖。Dijkstra演算法用於構建(MST)——即樹中指

《常見演算法資料結構》元素排序(1)——簡單排序(附動畫)

元素排序(1)——簡單排序 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是

淺談演算法資料結構: 二 基本排序演算法

本篇開始學習排序演算法。排序與我們日常生活中息息相關,比如,我們要從電話簿中找到某個聯絡人首先會按照姓氏排序、買火車票會按照出發時間或者時長排序、買東西會按照銷量或者好評度排序、查詢檔案會按照修改時間排序等等。在計算機程式設計中,排序和查詢也是最基本的演算法,很多其他的演算法都是以排序演算法為基礎,在一般的資

3DES對稱演算法之雙倍長金鑰演算法三倍長金鑰演算法

一般我們用的3Des演算法,大部分都是指雙倍長金鑰演算法,最近在閱讀某知名公司技術文件時發現,3DES演算法還有一種三倍長金鑰演算法。 演算法工具也側面印證了這個說法: 那麼這兩個演算法有什麼區別呢? 3DES,分為2種,一個是雙倍長3DES,一個是三倍長3DES。

蒙特卡羅演算法拉斯維加斯演算法比較

蒙特卡羅演算法並不是一種演算法的名稱,而是對一類隨機演算法的特性的概括。媒體說“蒙特卡羅演算法打敗武宮正樹”,這個說法就好比說“我被一隻脊椎動物咬了”,是比較火星的。實際上是ZEN的演算法具有蒙特卡羅特性,或者說它的演算法屬於一種蒙特卡羅演算法。 那麼“蒙特卡羅”是一種什

擴充套件(Extended Euclid)演算法求最大公約數乘法逆元

密碼學課本里面使用到的一個十分簡單的演算法,老師佈置的作業,就寫了一下...程式碼挺腦殘的,只要知道演算法的步驟,很好實現。 程式碼: #include<iostream> using namespace std; int a[3][3]; int coun