C语言算法最大公约数.docVIP

  • 2
  • 0
  • 约1.5千字
  • 约 4页
  • 2017-06-07 发布于重庆
  • 举报
C语言算法最大公约数

基本算法——辗转相除法 问题:输出两个正整数a,b,且0ab, 输出其最大公约数p和最小公倍数q 解法1—— p从a开始,检测p是否能同时整除a和b, 是则停止循环,不是则令p减1,继续检测。 q从b开始,检测q是否能同时被a和b整除,是则停止循环,不是则令q增1,继续检测。 源程序1 #include stdio.h void main() { int a,b, p, q; do{ printf(请输入\n); scanf(%d%d,a,b); } while ( a0 || b0 || ab); p=a; while( a%p!=0 || b%p!=0) p--; printf(这两个数的最大公约数是%d\n,); q=b; while( q%a!=0 || q%b!=0) q++; printf(这两个数的最小公倍数是%d\n,); } 改进——已知整数a,b及其最大公约数p,则直接可推算出最小公倍数q: q= a*b/p; 源程序2 #include stdio.h void main() { int a,b, p, q; do{ printf(请输入\n); scanf(%d%d,a,b); } while ( a0 || b0 || ab); p=a; while( a%p!=0 || b%p!=0) p--; printf(这两个数的最大公约数是%d\n,); q= a*b/p; printf(这两个数的最小公倍数是%d\n,); } 解法1的缺点:效率低。 例如a=1397, b=2413,其最大公约数p=127,为得到p,共循环了1397-127+1=1171次。 如何提高效率? 解法2——辗转相除法,在西方称为Euclid(欧几里)算法。计算(1397,2413)2413为被除数,以小数1397为除数,得商为1,余数被除数,余数1016为数商为1,余数为3811016为被除数,381为除商为2余数为254381为被除数, 以余数254为除数, 相除得商为1 ,余数为127254为被除数,发现能整除,127就是最大公约数。整个计算过程为: 2413 1397 1 1016 1397 1016 1 381 1061 381 2 254 381 254 1 127 254 127 2 0 数学证明: b=as+r (0≤r ≤b-1),且a,b的最大公约数用符号(a,b)代表 若r=0,显然(a,b)=; 若r≠0, 由于=as+r,每个能整除,r的整数都能整除(能同时整除a,b,,r) | (a,b) 另一方面,r=-aq, 每个能整除a,b的整数都能整除r (能同时整除,r, 故有 (a,b) | (a,r) 因此(a,b)=(,r) 辗转相除法源: #include stdio.h void main() { int a,b,r, m; do{ printf(请输入\n); scanf(%d%d,a,b); }while( a0 || b0 ||ab); m=a*b; do{ r=b%a; b=a; a=r; }while(r!=0); printf(这两个数的最大公约数是%d\n,r); printf(这两个数的最小公倍数是%d\n, m/r); //不能写“a*b/r” }

文档评论(0)

1亿VIP精品文档

相关文档