592.分数加减运算

592. 分数加减运算

*难度中等**

题目描述

1.jpg

解题思路

  • 根据分数的计算方法,使用最原始的方法进行计算,最后进行化简即可
  • 那么最原始的方法就是根据以下公式

2.jpg

  • 那么,设计所需要做的就是:
  1. 先将给定的字符串按照要求提出分子和分母并将其转化为整数,
  2. 将给定的“+”和减号“-”带入分子之中,即加号则分子为正,减号则分子为负
  3. 获取分母乘积之和
  4. 将分子*分母乘积之和/分母,并获得分子相加之和
  5. 通过最大公约数进行化简,得出最终结果

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
class Solution {
//求取最大公约数
public int gcd(int x, int y){
if(y != 0){
return gcd(y, x%y);
}else{
return x;
}
}
// i 分子,j 分母,k 符号
public String fractionAddition(String expression) {
// 用于计算最后一项,即j+1,保证存在
expression = expression + "+";
int len = expression.length();
//存储分母
int[] down = new int[11];
//存储分子
int[] up = new int[11];
// 分母乘积之和
int sum = 1;
int cnt = 0;
//Set<Integer> down = new HashSet<>();
int i = 0, j = 0, k = 0;
int flag = 0;
// 开头有无减号,分类讨论
if(expression.charAt(0) == '-'){
i = 1;
j = 3;
k = 0;
}else{
i = 0;
j = 2;
k = 3;
flag = 1;
}

int num1 = 0, num2 = 1;
while( i < len && j < len && k < len){
// 获取符号
char ch = ' ';
if(flag == 1){
ch = '+';
k = -1;
flag = 0;
}else{
ch = expression.charAt(k);
}
//System.out.println("---"+expression.substring(i+1,i+2));
//如果分子为10,占据2个长度,需要进行判断并将i+1, j+1, k+1保证后续循环还能继续找到对应位置
if(expression.charAt(i+1) != '/'){
num1 = 10;
i++;
j++;
k++;
}else{
num1 = Integer.parseInt(expression.substring(i, i + 1));
}
//System.out.println("j+1: "+expression.charAt(j+1));
// 分母同理。不过要注意最后于一项
if(expression.charAt(j+1) != '+' && expression.charAt(j+1) != '-'){
num2 = 10;
i++;
j++;
k++;
}else {
num2 = Integer.parseInt(expression.substring(j, j + 1));
}
if(ch == '-'){
num1 = 0-num1;
}
//out.println("num1: "+num1);
//System.out.println("num2: "+num2);
up[cnt] = num1;
down[cnt++] = num2;
sum = sum * num2;
//dwon.add(num2);
// 加4获得下一项对应位置
i = i+4;
j = j+4;
k = k+4;
}
// 分子相加之和
int resUp = 0;
for(int a = 0; a < cnt; a++){
resUp += up[a] * (sum / down[a]);
}
//System.out.println("---"+sum);
//System.out.println("---"+resUp);
// 获取最大公约数
int g = gcd(resUp, sum);
if(g < 0)
g = 0-g;
return resUp/g + "/" + sum/g;
}
}

PS: 不一定最好的,因为做完的时候已经23:57了~_~

每日一图

3.jpg

作者

Yzdong

发布于

2022-07-27

更新于

2023-04-14

许可协议

评论