本题要求两个给定正整数的最大公约数和最小公倍数。
第一遍自己做时,根据原理暴力求解
结果可想而知超时了
看完翁恺老师的视频,学会第二种方法———辗转相除法
辗转相除法是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。这个和更相减损术有着异曲同工之处。
#include<stdio.h> int gcd(int a, int b) { int t; while(b!=0) { t=a%b; a=b; b=t; } return a; } int main() { int a,b; scanf("%d%d",&a,&b); printf("gcd=%d\n",gcd(a,b)); return 0; }
最后在找网上其他资料时,发现一种和辗转相除法类似的方法————
更相减损术
这里举个例子
用更相减损术求98与63的最大公约数。(一奇一偶)
由于63不是偶数,把98和63以大数减小数,并辗转相减:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
当差和被减数相等时候,运算结束
所以,98和63的最大公约数等于7。
并且求最大公倍数只需将两数相乘再除最后的数
#include<stdio.h> #include<math.h> int main() { int x,y,n; scanf("%d %d",&x,&y); n=x*y; while(x!=y){ if(x>y){ x=x-y;} else{y=y-x;} }; printf("%d %d",x,n/x); return 0; }
总结:三种方法都正确,第一种是按定义来,查找速度比较慢;第二和第三种都需要一定的数学层面上的理解;学好数学打代码运行才不会超时呀!
标签:98,公倍数,int,最大公约数,63,三种,余数 From: https://www.cnblogs.com/asl654-/p/16841629.html