数学知识背景记录:
任何>1的整数都可以写成一个或多个素数因子乘积的形式,且素数乘积因子以非递减序出现。
则整数x,y可以分别标记为:
x=p1x1p2x2...pmxm
y=p1y1p2y2...pmym
(其中p1,p2,....是素数,若有必要素数因子的指数xj或yj可以为0)
(1)最大公约数 gcd(x,y)=p1min(x1,y1)p2min(x2,y2)...pmmin(xm,ym)
(2)最小公倍数 lcm(x,y)=p1max(x1,y1)p2max(x2,y2)...pmmax(xm,ym)
(3)因此,亦可得:lcm(x,y)*gcd(x,y)=x*y
按如上思路计算gcd(x,y)//函数 int get_gcd(int x,int y);
实际上若是单纯的计算最大公约数和最小公倍数可以不必这么复杂,可以从大到小遍历min(x,y)的约数,找到的第一个公约数即为所求。
1 int get_gcd(int x,int y) 2 { 3 int temp; 4 int i; 5 if(x>y) 6 { 7 temp=x; 8 x=y; 9 y=temp; 10 } 11 if(y%x==0) 12 return x; 13 for(i=x/2;i>1;i--) 14 if(x%i==0) 15 if(y%i==0) 16 return i; 17 return 1; 18 } 19 20 int get_lcm(int x,int y) 21 { 22 return (x*y)/(get_gcd(x,y)); 23 }
时间: 2024-10-09 13:30:38