LeetCode 题解 592. 分数加减运算
题目描述
给定一个表示分数加减运算的字符串expression,你需要返回一个字符串形式的计算结果。
这个结果应该是不可约分的分数,即最简分数。 如果最终结果是一个整数,例如2,你需要将它转换成分数形式,其分母为1。所以在上述例子中, 2 应该被转换为 2/1。
样例
样例输入 #1
2/1+1/3-1/4
样例输出 #1
25/12
样例输入 #2
1/2+1/3+1/4-1/4+1/5-1/5+6/1-6/1
样例输出 #2
5/6
样例输入 #3
7/4+1/3+8/5-3/2-6/9-6/4-5/2+6/2+4/9-3/9-2/3+5/2-5/4+3/9-3/8-5/8+6/8+3/8-4/7-5/7-3/6+6/9-5/6-5/7-5/2
样例输出 #3
-1259/360
样例输入 #4
1/2-1/2
样例输出 #4
0
提示
- 输入和输出字符串只包含
'0'到'9'的数字,以及'/','+'和'-'。 - 输入和输出分数格式均为
±分子/分母。如果输入的第一个分数或者输出的分数是正数,则'+'会被省略掉。 - 输入只包含合法的最简分数,每个分数的分子与分母的范围是 [1,10]。 如果分母是1,意味着这个分数实际上是一个整数。
- 输入的分数个数范围是 [1,10]。
- 最终结果的分子与分母保证是 32 位整数范围内的有效整数。
题解
思路
1.数据读取
2.通分累加
3.约分输出
C代码
/*辗转相除法计算最大公约数*/
int greatest_common_divisor(int i, int j) {
int a = i, b = j;
if (a < b) {
int temp = a;
a = b;
b = temp;
}
int m = a * b;
int c = a % b;
while (c) {
a = b;
b = c;
c = a % b;
}
return b;
}
/*通分*/
void add(int* a, int* b) {
int LCM = a[1] * b[1] / greatest_common_divisor(a[1], b[1]);
/*LCM为最大公约数(least_common_multiple)*/
a[0] = a[0] * LCM / a[1] + b[0] * LCM / b[1];
a[1] = LCM;
}
char* fractionAddition(char* expression) {
int ans[2] = { 0, 1 };//ans[0]存储当前已累加分数的分子,ans[1]存储当前已累加分数的分母
int index = 0, tail = strlen(expression);
while (index < tail) {
int sign = 1;//符号位
int num[2] = { 0, 0 };//num[0]存储当前正读入分数的分子,num[1]存储当前正读入分数的分母
/*读取符号位*/
if (expression[index] == '-' || expression[index] == '+') {
sign = expression[index] == '-' ? -1 : 1;
index++;
}
/*读取分子*/
while (index < tail && expression[index] >= '0' && expression[index] <= '9') {
num[0] = num[0] * 10 + expression[index] - '0';
index++;
}
num[0] *= sign; //添加符号位
index++; //跳过‘/’符号
/*读取分母*/
while (index < tail && expression[index] >= '0' && expression[index] <= '9') {
num[1] = num[1] * 10 + expression[index] - '0';
index++;
}
/*累加分数*/
add(ans, (int*)(num));
}
/*分子为0时直接输出,避免约分时计算最大公倍数因为除数为0而报错*/
if (ans[0] == 0) {
ans[1] = 1;
}
else {
int GCD = greatest_common_divisor(ans[0], ans[1]);
ans[0] /= GCD;
ans[1] /= GCD;
/*不知道为啥偶尔ans[]分子位置的负号会出现在分母位置,所以只好手动调换两者符号了*/
if (ans[1] < 0) {
ans[0] *= -1;
ans[1] *= -1;
}
}
char* string_ans = (char*)malloc(sizeof(char) * 80);
sprintf(string_ans, "%d/%d", ans[0], ans[1]);
return string_ans;
}
通过详情


浙公网安备 33010602011771号