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;
}

通过详情

image

posted @ 2022-10-14 11:12  残影0无痕  阅读(37)  评论(0)    收藏  举报