欧几里德辗转相除的扩展函数

#include <stdio.h> /* 函数名:gcdex 返回值: a,b的最大公约数 功能:求出a,b最大公约数,并且解出方程 a*u+b*v = gcd(a,b) u,v的值 例子: 24 36 它们的公约数为12 12 = 24*(-1)+36*(1) */ /* 程序的算法依据: a%b = a-(a/b)*b 这个公式可以用矩阵表示出来 | 0 1 | | a | | b | | m[i] | | 1 a/b | | b | = | a%b | = | n[i] | 递推即可得出 | 0 1 | …………| 0 1 | | 0 1 | | a | | b | | m[i] | | 1 m[i]/n[i] | …………| 1 m[2]/n[2] | | 1 m[1]/n[1] | | b | = | a%b | = | 0 | 求出一下表达式第一行的两个元素的值,即是u,v | 0 1 | …………| 0 1 | | 0 1 | | 1 m[i]/n[i] | …………| 1 m[2]/n[2] | | 1 m[1]/n[1] | */ int gcdex(int a,int b,int &u,int &v) { /* 构造的矩阵如图 | u v | |temu temv| */ int temp,temu=1,temv=-(a/b),p,q; u=0; v=1; while (1) { temp = b; b = a%b; a = temp; if(b == 0) break; p=u;q=v; u = temu;v = temv; temu = p+(-a/b)*temu; temv = q+(-a/b)*temv; } return a; } int main() { int a,b,tmp; int u,v; while(scanf("%d%d",&a,&b)!=EOF) { tmp=gcdex(a,b,u,v); printf("gcd is : %d = %d * (%d) + %d * (%d) /n",tmp,a,u,b,v); } return 0; }

你可能感兴趣的:(算法,扩展,include)