求最大公约数和最小共倍数的方法(除穷举)
求最小共倍数:
最小共倍数=两数的成绩÷最大公约数。
求最大公约数:
- 辗转相除法
- 相减法
辗转相处:
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
例如求27和15的最大公约数过程为:
27÷15 余1215÷12余312÷3余0因此,3即为最大公约数
#include<bits/stdc++.h> using namespace std; int main(){// 辗转相除法求最大公约数 int a,b,c; scanf("%d%d",&a,&b); int m=a,n=b; while(c!=0){// 余数不为0,继续相除,直到余数为0 c=a%b; a=b; b=c; } printf("The largest common divisor:%d\n",a);//注意这里不是b,因为跳出循环时b已经是c了 printf("The least common multiple:%d",m*n/a); return 0; }
相减法:
有两整数a和b:
① 若a>b,则a=a-b
② 若a<b,则b=b-a
③ 若a=b,则a(或b)即为两数的最大公约数
④ 若a≠b,则再回去执行①
例如求27和15的最大公约数过程为:
27-15=12( 15>12 ) 15-12=3( 12>3 )
12-3=9( 9>3 ) 9-3=6( 6>3 )
6-3=3( 3==3 )
因此,3即为最大公约数
#include<bits/stdc++.h> using namespace std; int a,b; int main(){ scanf("%d%d",&a,&b); int m=a,n=b; while(a!=b){ if(a>b)a=a-b; if(a<b)b=b-a; } printf("The largest common divisor:%d\n",a); printf("The least common multiple:%d",m*n/a); return 0; }
洛谷小题:
#include<bits/stdc++.h> using namespace std; int x,y; int ans; int gcd(int a,int b){//求最大公约数 //if(a<b)swap(a,b); if(a%b==0)return b; if(a==b)return b; return gcd(b,a%b); } int lcm(int a,int b){//求最小共倍数 return a*b/gcd(a,b); } int main(){ scanf("%d%d",&x,&y); for(int i=x;i<=y;i++){ int j=x*y/i; if(gcd(i,j)==x&&lcm(i,j)==y){ ans++; } } printf("%d",ans); return 0; }