2021.12.1 C++学习之分式化简
C++学习之分式化简
题目来源于力扣
题目如下:
有一个同学在学习分式。他需要将一个连分数化成最简分数,你能帮助他吗?

连分数是形如上图的分式。在本题中,所有系数都是大于等于0的整数。
输入的cont代表连分数的系数(cont[0]代表上图的a0,以此类推)。返回一个长度为2的数组[n, m],使得连分数的值等于n / m,且n, m最大公约数为1。
示例 1:
输入:cont = [3, 2, 0, 2]
输出:[13, 4]
解释:原连分数等价于3 + (1 / (2 + (1 / (0 + 1 / 2))))。注意[26, 8], [-13, -4]都不是正确答案。
示例 2:
输入:cont = [0, 0, 3]
输出:[3, 1]
解释:如果答案是整数,令分母为1即可。
限制:
cont[i] >= 0
1 <= cont的长度 <= 10
cont最后一个元素不等于0
答案的n, m的取值都能被32位int整型存下(即不超过2 ^ 31 - 1)。
这道题我的解法思路就是化简,先从最里面开始化简,把每个分母看成如下格式:

但最里面必有一个结果为1/an;例如根据样例 [3, 2, 0, 2],为

如何把a3变成我们需要的a+1/b就是关键,所以我们假设一个n/m,n=0,m=1;令最里面a3处实际为a3+0/1;但我们每次算完都是只计算了分母,故我们还需要将分子后分母颠倒。在最后时我们多颠倒了一次,故应该倒回来。
直接上代码:
class Solution {
public:
vector<int> fraction(vector<int>& cont) {
int n=0,m=1;
int tmp=0;
int x = cont.size();
for(int i=x;i>0;i--)
{
n=cont[i-1]*m+n;
tmp=n;
n=m;
m=tmp;
}
return vector<int>{m, n};
}
};
这道题就解开了。
本文介绍了如何使用C++解决将连分数化简为最简分数的问题,通过解析输入的系数数组,逐步化简分式,确保结果的分子和分母互质。文章提供了一个解题思路和代码实现。
719

被折叠的 条评论
为什么被折叠?



