diff --git a/算法/A类:基本算法/3.9 位运算算法.md b/算法/A类:基本算法/3.9 位运算算法.md
index ab11b926..f26b844c 100644
--- a/算法/A类:基本算法/3.9 位运算算法.md
+++ b/算法/A类:基本算法/3.9 位运算算法.md
@@ -17,7 +17,7 @@
操作 | 性质
|-----| -----|
n & (n - 1) | n中的最后一个1变成0。
-n & (\~n + 1) | lowbit()运算,n中最后一个1保留。
+n & (\~n + 1)
n&(n^(n-1)) | lowbit()运算,n中最后一个1保留。
(\~n) + 1== -n | 计算机中补码表示的-n。位运算取反
n/2 | 等价于 右移一位 n >> 1
n*2 | 等价于 左移一位 n << 1
diff --git a/算法/A类:基本算法/4.12 gcd&lcm.md b/算法/A类:基本算法/4.12 gcd&lcm.md
new file mode 100644
index 00000000..021cc3c3
--- /dev/null
+++ b/算法/A类:基本算法/4.12 gcd&lcm.md
@@ -0,0 +1,112 @@
+## 最大公约数
+
+### 循环法
+
+```
+#include
+
+using namespace std;
+
+int gcd1(int x,int y){
+ if(x%y==0){
+ return y;
+ }
+ return gcd1(y,x%y);
+}
+
+int gcd2(int x,int y){
+ int r = x % y;
+ while( r )
+ {
+ x = y;
+ y = r;
+ r = x % y;
+ }
+ return y;
+
+}
+
+int lcm(int x,int y){
+ int k = gcd2(x,y);
+ return x*y/k;
+}
+int main(){
+ int x=60,y=95;
+ cout<
+
+using namespace std;
+
+int gcd1(int x,int y){
+ if(x%y==0){
+ return y;
+ }
+ return gcd1(y,x%y);
+}
+
+int gcd2(int x,int y){
+ int r = x % y;
+ while( r )
+ {
+ x = y;
+ y = r;
+ r = x % y;
+ }
+ return y;
+
+}
+
+int lcm(int x,int y){
+ int k = gcd2(x,y);
+ return x*y/k;
+}
+int main(){
+ int x=60,y=95;
+ cout<
+
+using namespace std;
+
+int gcd1(int x,int y){
+ if(x%y==0){
+ return y;
+ }
+ return gcd1(y,x%y);
+}
+
+int gcd2(int x,int y){
+ int r = x % y;
+ while( r )
+ {
+ x = y;
+ y = r;
+ r = x % y;
+ }
+ return y;
+
+}
+
+int lcm(int x,int y){
+ int k = gcd2(x,y);
+ return x*y/k;
+}
+int main(){
+ int x=60,y=95;
+ cout<
+
+using namespace std;
+
+int gcd1(int x,int y){
+ if(x%y==0){
+ return y;
+ }
+ return gcd1(y,x%y);
+}
+
+int gcd2(int x,int y){
+ int r = x % y;
+ while( r )
+ {
+ x = y;
+ y = r;
+ r = x % y;
+ }
+ return y;
+}
+
+int lcm(int x,int y){
+ int k = gcd2(x,y);
+ return x*y/k;
+}
+int main(){
+ int x=60,y=95;
+ cout<