代码:
/* * Copyright (c) 2016, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:exgcd.cpp * 作 者:单昕昕 * 完成日期:2016年4月2日 * 版 本 号:v1.0 */ #include<iostream> #include<cstring> #include<cstdio> #include<malloc.h> using namespace std; typedef long long ll; ll exgcd(ll m,ll &x,ll n,ll &y) //Extend Euclid { ll x1,y1,x0,y0; x0=1;y0=0; x1=0;y1=1; ll r=(m%n+n)%n; ll q=(m-r)/n; x=0;y=1; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1; y0=y1; x1=x;y1=y; m=n;n=r;r=m%n; q=(m-r)/n; } return n; } int main() { ll a,b,x,y,c; cin>>a>>b>>c;//输入三个数 int A=a,B=b,C=c; ll M=exgcd(a,x,b,y); if(c%M) cout<<"Impossible"<<endl; else { x=x*C/M; x=(x%(b/M)+b/M)%(b/M);//x的值 cout<<"x="<<x; y=(C-x*A)/B;//y利用x求出来 cout<<" y="<<y<<endl; } return 0; }
测试代码:
/* * Copyright (c) 2016, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:exgcd.cpp * 作 者:单昕昕 * 完成日期:2016年4月2日 * 版 本 号:v1.0 */ #include<iostream> #include<cstring> #include<cstdio> #include<malloc.h> using namespace std; typedef long long ll; ll exgcd(ll m,ll &x,ll n,ll &y) //Extend Euclid { ll x1,y1,x0,y0; x0=1;y0=0; x1=0;y1=1; ll r=(m%n+n)%n; ll q=(m-r)/n; x=0;y=1; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1; y0=y1; x1=x;y1=y; m=n;n=r;r=m%n; q=(m-r)/n; } return n; } int main() { ll a,b,x,y,c; cin>>a>>b>>c; int A=a,B=b,C=c; ll M=exgcd(a,x,b,y); if(c%M) cout<<"Impossible"<<endl; else { cout<<"a="<<A<<" b="<<B<<" c="<<C<<endl; x=x*C/M; x=(x%(b/M)+b/M)%(b/M); cout<<"x="<<x; y=(C-x*A)/B; cout<<" y="<<y<<endl; cout<<A*x<<"+"<<B*y<<"="<<C<<endl; } return 0; }