四行程式碼求最大公約數(歐幾里得演算法)
本文要介紹的不是普通的歐幾里德演算法(輾轉相除法),而是利用位操作實現的歐幾里得演算法。
利用位操作實現歐幾里得演算法主要有以下兩個優點:1.程式碼量少 2.效率高。
首先,歐幾里德演算法求最大公約數的做法是:
⒈ 令r為a/b所得餘數(0 <= r < b) 若 r= 0,演算法結束;b 即為答案。
⒉ 互換:置 a←b,b←r,並返回第一步。
int gcd(int a, int b){
while(b^=a^=b^=a%=b);
return a;
}
b^=a^=b^=a%=b
可以分解成以下四句
a=a%b;
b=b^a;
a=a^b;
b=b^a;
第一句用a存餘數,剩下三句交換a,b,再配合while判斷此時b是否為0,不為0則繼續迴圈。
另外,不用擔心a,b誰大誰小的問題,如果a < b,那麼,在第一輪迴圈中便可將兩者換回來
相關推薦
四行程式碼求最大公約數(歐幾里得演算法)
本文要介紹的不是普通的歐幾里德演算法(輾轉相除法),而是利用位操作實現的歐幾里得演算法。 利用位操作實現歐幾里得演算法主要有以下兩個優點:1.程式碼量少 2.效率高。 首先,歐幾里德演算法求最大公約數的做法是: ⒈ 令r為a/b所得餘數(0 <
HRBU-ACM 數論2-最大公約數(歐幾里得)
高中我們都學過輾轉相除法,如果有人沒學過或者忘記了那也沒關係,在這裡我們在講解一遍歐幾里得演算法(求最大公約數) 歐幾里德演算法是用來求兩個正整數最大公約數的演算法。是由古希臘數學家歐幾里德在其著作《The Elements》中最早描述了這種演算法,所以被命名為歐幾里德演算法。
C語言輾轉相除/相減法(歐幾里得演算法)求最大公約數和最小公倍數
#include <stdio.h> #include <stdlib.h> //題目:輸入兩個正整數m和n,求其最大公約數和最小公倍數。 //採用任何兩種演算法來完成上述題目,並比較2種演算法的時間複雜度和空間複雜度。 int main() { int
模板:最大公約數(歐幾裏得)和最小公倍數
歐幾裏得 spa 模板 最大公約數 blog gcd type typedef 最大 1 typedef long long LL; 2 3 LL gcd(LL a,LL b){ 4 return (b==0) ? a : gcd(b,a%b); 5
關於最大公約數的三種解法之一(歐幾里得演算法)
亞歷山大時期的歐幾里得所著的《幾何原本》中這樣定義了最大公約數的演算法,兩個不全為0的非負整數m,n的最大公約數記為gcd(m,n),代表能夠整除(即餘數為0)m,n的最大正整數。歐幾里得演算法的方法就是重複應用下列等式,一直到m mod n等於0。
同餘定理(歐幾里得演算法)
如果 (a-b)%m==0 那麼 a%m==0 b%m==0 a,b關於模m同餘。 求最大公約數 #include "pch.h" #include<iostream> #include<cstdio> #include<
BZOJ ~ 1385 ~ Division expression (歐幾里得演算法)
題解 原式化為情況下最有可能。然後看能否把x2的約去即可。當然不能把上面那個數字乘出來了,它太大了,所以我們拿上面的每一個數字和x2去約GCD即可。 #include<bits/stdc+
輾轉相除法(歐幾里得演算法)java實現
輾轉相除法,又叫歐幾里得演算法,是用以計算兩個非負整數的最大公約數,在數學課本上是見過了,程式又是怎樣實現的。其實,只需4行。 計算兩個非負整數 p 和 q 的最大公約數:若q 是 0,則最大公約數為
C語言輾轉相除法(歐幾里德演算法)求最大公約數
演算法敘述: 設(a,b)表示a和b的最大公約數 若c為a/b的餘數(c=a%b) 則(a,b)=(b,c). #include<stdio.h> int gcd(int a,int b
hdu2028求最小公倍數(歐幾裏得)
urn class pac color mod ostream 兩個 pla spl 用到了歐幾裏得算法: int gcd(int a,int b) { if(b==0)return a; gcd(b,a%b); } View Code 這道題強調
POJ 2115 for求迴圈次數-數論-(同餘方程+擴充套件歐幾里得演算法)
題意:給定for迴圈的初始值,結束值和增量,還有一個模,求最少的迴圈次數。 分析: 讀完題後應該就知道是一個同餘的概念,所以就是解一個一元一次同餘方程,像上題一樣用擴充套件歐幾里得演算法。這題的trick點是k最大為32,那麼2^32超出了int,要用long long,所
POJ-1061-青蛙的約會 (擴充套件歐幾里得演算法)
原題連結: http://poj.org/problem?id=1061 兩隻青蛙在網上相識了,它們聊得很開心,於是覺得很有必要見一面。它們很高興地發現它們住在同一條緯度線上,於是它們約定各自朝西跳,直到碰面為止。可是它們出發之前忘記了一件很重要的事情,既沒有問清楚對方的特徵,也沒有約定
HDU-2669-Romantic (擴充套件歐幾里得演算法)
原題連結: http://acm.hdu.edu.cn/showproblem.php?pid=2669 The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Trees
POJ-2142-The Balance (擴充套件歐幾里得演算法)
原題連結: Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. For example, to measure 200mg of aspiri
poj 1061 青蛙的約會(拓展歐幾里得演算法)
【題目】 【題意】 兩隻青蛙在給定長度的數軸上運動,給定初始位置和跳躍每次的長度,問在什麼時候兩隻青蛙能相遇。 【思路】 根據題意有x+mt=y+nt+kl,t表示跳躍次數。變化一下得到式子
兩個數的生成範圍(兩個生成元)(拓展歐幾里得演算法)
最近遇到一個題,就是給兩個數,這兩個數有無限個,問你由這些數能得到哪些數。 還可以擴充套件成有n個數,問你能得到哪些數 這裡其實是有一個結論的,就是: ①兩個數互質,就可以生成很多很多數,而且從某個數開始就是連續的 ②兩個數不互質,生成的數一定是gcd(a,b)的
解的個數(直線上的點)(數論-擴充套件歐幾里得演算法)
Description 已知x,y滿足如下條件: ax+by+c=0 ; x1 <= x <= x2 ; y1 <= y <= y2 ; x,y均為整數。 其中:a,b,c,x1,x2,y1,y2 都是絕對值不超過 10^8 的整數。 求(x,
ACM基礎演算法複習(STL + DFS + BFS + 並查集 + 快速冪 + 歐幾里得演算法)
從進隊到現在,師哥們陸陸續續講了很多基礎演算法,對我這種菜雞而言沒有什麼基礎,感覺都挺難的,所以還是複習複習,看看還有多少沒還給師哥的。。。 上課的內容大致有以下幾個模組(C語言基礎和python姑且不算) 1. STL
51nod 1256 乘法逆元(擴充套件歐幾里得演算法)
思路1:把k*M%N=1可以寫成一個不定方程,(k*M)%N=(N*x+1)%N,那麼就是求k*M-N*x=1使得k最小,不定方程利用擴充套件歐幾里得演算法 --------------------------------------------------------
Python程式碼筆記(1)輾轉相除法/歐幾里得演算法求最大公約數gcd(m,n)
歐幾里得演算法求最大公約數:輾轉相除法 具體做法:用較小數除較大數,再用出現的餘數(第一餘數)去除除數,再用出現的餘數(第二餘數)去除除數,如此反覆,直到最後餘數是0為止。如果是求兩個數的最大公約數,