GCD最大公约数
辗转相除法(又称欧几里得算法)
当时,;否则
递归或循环运算得出结果。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int gcd(int a,int b){
int r;
while(b>0){
r=b;
b=a%b;
a=r;
}
return a;
}
//-----递归写法-----
//int gcd(int a,int b){
// return b==0 ? a:gcd(b,a%b);
//}
int main(){
int a,b;
cin>>a>>b;
cout<<gcd(a,b);
}
exgcd 扩展欧几里得
扩展欧几里得定理:若gcd(a,b)=1 则必存在 x y 使得 a*x+b*y=1
这相当于解二元一次方程 已知 a b 如何求得 x y呢
下面是模板 可以解出x y
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1,y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
int t=y;
y=x-(a/b)*y;
x=t;
return r;
}
int main(){
int x,y,a,b;
cin>>a>>b;
int r=exgcd(a,b,x,y);
cout<<r<<" "<<x<<" "<<y;
}