两个分数的最小公倍数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
两个分数的最⼩公倍数
Tips: 本⽂中所求的最⼩公倍数的对象都是正数!
在求两个分数的最⼩公倍数之前,我们可以先来回顾⼀下如何求两个⾃然数的最⼩公倍数:
1. 两个⾃然数的最⼩公倍数
假设已知两个⾃然数a和b,求两者的最⼩公倍数 f(a,b):
(1)如果两个数互质,那么易知最⼩公倍数为
f(a,b) = a*b;
(2)如果两个数有公约数,不妨设⼀共有N个公约数,每个公约数为gi(a,b) (i=1~N),那么可知两者的乘积 a*b,必定包含gi(a,b),那么最⼩公倍数必定为
f(a,b)= min a*b/gi(a,b); // i=1~N
设gcd(a,b) 为a和b的最⼤公约数,则有
f(a,b) = a*b/gcd(a,b);
⼜有,如果a和b互质,那么必有gcd(a,b)=1
所以,任意两个整数a和b的最⼩公倍数求解公式为
f(a,b) = a*b/gcd(a,b); // a,b为任意⾃然数
2. 两个分数的最⼩公倍数
2.1 易知任意⾃然数都能表⽰成分数形式,例如⾃然数a,可以表⽰成
a = a*N/N; // N为任意⾮零整数
那么求任意两个整数a和b的最⼩公倍数,可以转换成:
a = a*N1/N1; // N1为任意正整数
b = b*N2/N2; // N2为任意正整数
// 通分
a = a*N1*N2/ N1*N2;
b = b*N2*N1/ N2*N1;
//分别对分⼦和分母求最⼩公倍数
f1(a,b) = (a*N1*N2) * (b*N2*N1) / gcd(a*N1*N2, b*N1*N2); //分⼦最⼩公倍数
f2(a,b) = (N1*N2)*(N1*N2)/ gcd(N1*N2, N1*N2); // 分母最⼩公倍数
// 化简得
f1(a,b) = a*b*N1*N2/gcd(a,b);
f2(a,b) = N1*N2;
// 结果
f(a,b) = a*b / gcd(a,b);
2.2 若a和b为两个真分数,那么怎么求两者的最⼩公倍数⽅法可以参考2.1中的⽅法:
(1)分别对a和b进⾏通分
(2)对通分后的a和b的分⼦和分母分别求最⼩公倍数f1,f2
(3) f= f1/f2 对结果进⾏约分,即可得到最终结果
例如:
已知 a = 9/4 b= 4/3 ,求两者的最⼩公倍数
(1) 通分 a = 27/12 b = 16/12
(2) 分别求分⼦和分母的最⼩公倍数
f1 = 27*16/gcd(27,16) = 432
f2 = 12
(3) f = f1/f2= 432/12 = 36
3. 优化⽅法:
从上⾯可以看到通分这个步骤需要多次进⾏乘法操作,如果数字过⼤,则可能出现超过数据范围,能否简化,减少乘法的次数呢?如果不通分,该怎么做呢?
(1) 对a和b的分⼦进⾏最⼩公倍数 f1
(2) 求a和b的分母的最⼩公约数g1
(3) f = f1/g1 化简之
例如:
已知 a = 9/4 b= 4/3 ,求两者的最⼩公倍数
// 通分法
(1) 通分 a = 27/12 b = 16/12
(2) 分别求分⼦和分母的最⼩公倍数
f1 = 27*16/gcd(27,16) = 432
f2 = 12
(3) f = f1/f2= 432/12 = 36
// 优化法
(1) f1 = 9*4/gcd(9,4) =36;
(2) g1 = gcd(4,3) =1;
(3) f = f1/g1 = 36
具体的理论证明略。
code如下:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5int la,ra,lb,rb,num,temp1,temp2,res;
6
7int gcd(int a,int b)
8 {
9if(a*b==0) return0;
10if(a%b==0) return b;
11return gcd(b,a%b);
12 }
13
14int main()
15 {
16int T,i,lsa,lsb;
17char c1,c2;
18 scanf("%d",&T);
19while(T--)
20 {
21 scanf("%d/%d %d/%d",&la,&ra,&lb,&rb);
22
23// 化简表达式A
24 temp1= gcd(la,ra);
25 la/=temp1;
26 ra/=temp1;
27
28// 化简表达式B
29 temp2 = gcd(lb,rb);
30 lb/=temp2;
31 rb/=temp2;
32
33// 求分⼦的最⼩公倍数
34 temp1 = gcd(la,lb);
35 res= la/temp1*lb;
36
37// 求分母的最⼤公约数
38 temp2 = gcd(ra,rb);
39
40// 对结果约分
41 temp1 = gcd(res,temp2);
42 res /=temp1;
43 temp2/=temp1;
44
45if(temp2==1) printf("%d\n",res); 46else
47 printf("%d/%d\n",res,temp2);
48 }
49return0;
50 }
1713。