给出整数 a , b , n ,问方程 ax + by = n 什么时候有整数解?如何求出所有的整数解? 有解的充分必要条件是 gcd(a,b) 整除 n 简单解释一下,令 a = gcd(a,b) a’ , b = gcd(a,b) b’ ,有 ax + by = gcd(a,b)(a’x+b’y) = n,如果 x , y ,a’ , b’ 都是整数的话,那么 n 必须是 gcd(a,b) 的倍数才有解。 例如 4x+6y = 8、2x+3y = 4 有整数解,而 4x+6y = 7没有整数解。 当方程符合 用拓展欧几里得算法得出方程 ax + by = gcd(a,b) 的一个特解后,利用它可以进一步得出任意方程 ax + by = n 的一个解,步骤如下: 综上总的代码为:问题引入
如果确定有解,一种解题的方法是先找到一个解(x0,y0),那么通解就为:
x = x0 + bt , y = y0 – at (t 是任意整数)
利用拓展欧几里得算法便可以求出特解(x0,y0)拓展欧几里得算法
ax + by = gcd(a,b)
时,可用拓展欧几里得算法求出(x0,y0),如下:void gcdEx(int a,int b,int &x,int &y) { if(b == 0){ x=1; y=0; return; } gcdEx(b,a%b,x,y); int tmp = x; x = y; y = tmp - (a/b)*y; }
求任意方程 ax + by = n 的一个整数解
gcd(a,b)n , 得:
gcd(a,b)ax0n +
gcd(a,b)by0n = n
x’0 =
gcd(a,b)x0n , y’0 =
gcd(a,b)y0n//拓展欧几里得算法 void gcdEx(int a,int b,int &x,int &y);//参加上方 int main() { int a,b,n,x(0),y(0); cin>>a>>b>>n; if(n%__gcd(a,b) == 0){ //第一步判断方程是否有整数解 gcdEx(a,b,x,y);//第二步求方程 ax+by=gcd(a,b) 的一个特解 x = x*n/__gcd(a,b); //第三步计算 ax+by=n 的解 y = y*n/__gcd(a,b); cout<<x<<" "<<y<<endl; } return 0; }
应用场合
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算