1.题目
给定一个表示分数加减运算的字符串 expression ,你需要返回一个字符串形式的计算结果。
这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如 2,你需要将它转换成分数形式,其分母为 1。所以在上述例子中, 2 应该被转换为 2/1。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fraction-addition-and-subtraction
2.解题思路
跪了orz.题目不难,关键是如何实现。
分数运算->通分。
化简结果->分子分母同除最大公约数。
需要注意的点:
1.字符转换为数字
int a='1'-0; //a=1
2.C++ 函数的使用
string类 :求字符串长度: expression.size()
判断一个字符是否为数字:isdigit()
求最大公约数:gcd()
数字转化为字符串:tostring()
3.代码
class Solution {
public:
string fractionAddition(string expression) {
int fz=0,fm=1;//分子,分母
int index=0,n=expression.size();
while(index<n){
int fz1=0,sign=1;
//读入分子,符号位
if(expression[index]=='-' || expression[index]=='+'){
sign=expression[index++]=='-'?-1:1;
}
while(index<n && isdigit(expression[index])){
fz1=fz1*10+expression[index++]-'0';
}
fz1=sign*fz1;
index++;
//读分母
int fm1=0;
while(index<n && isdigit(expression[index])){
fm1=fm1*10+expression[index++]-'0';
}
//利用通分计算一次结果
fz=fz*fm1+fz1*fm;
fm=fm*fm1;
}
if(fz==0){
return"0/1";
}
//约分
int common_part=gcd(abs(fz),fm);
return to_string(fz/common_part)+"/"+to_string(fm/common_part);
}
};