题目描述
有一个同学在学习分式。他需要将一个连分数化成最简分数,你能帮助他吗?
连分数是形如上图的分式。在本题中,所有系数都是大于等于 0 的整数。
输入的cont
代表连分数的系数(cont[0]
代表上图的a0
,以此类推)。返回一个长度为 2 的数组[n, m]
,使得连分数的值等于n / m
,且n, m
最大公约数为 1。
题目分析
从后向前,依次求出分母和分子即可。
- 初始化分子=a3,分母=1
- 从 a2 循环直到 a0:
- 现在的分子 = 上次的分母
- 现在的分母 = 当前数 × 上次的分子 + 上次的分母、
- 循环结束,求得分母和分子。
此题最终的结果是 a + 1/b,通分后:
- 分母:ab+1
- 分子:b
(ab+1)和 b 两数互质,所以不用求最大公约数,直接返回即可。
题解代码
/**
* @param {number[]} cont
* @return {number[]}
*/
var fraction = function (cont) {
let molecular = cont[cont.length - 1]; // 初始化分子
let denominator = 1; // 初始化分母
let temp = 0;
for (let i = cont.length - 2; i >= 0; i--) {
temp = denominator;
denominator = molecular; // 现在的分母 = 上次的分子
molecular = cont[i] * molecular + temp; // 现在的分子 = 当前数*上次的分子 + 上次分母
}
return [molecular, denominator];
};