-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathFractionAdditionAndSubtraction.cpp
More file actions
103 lines (78 loc) · 2.04 KB
/
Copy pathFractionAdditionAndSubtraction.cpp
File metadata and controls
103 lines (78 loc) · 2.04 KB
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
96
97
98
99
100
101
102
103
class Solution {
public:
string get(string s, int& i){
string ans = "";
if(s[i] == '-' || s[i] == '+'){
ans = s[i];
i++;
}
while(!(s[i] == '+' || s[i] == '-') && i < s.size()){
ans = ans + s[i];
i++;
}
return ans;
}
void getValues(string s, int& num, int& den){
string numi = "", deni = "";
int i = 0;
if(s[i] == '-'){
numi = "-";
i++;
}
while(s[i] != '/'){
numi = numi + s[i];
i++;
}
i++;
num = stoi(numi);
while(i < s.size()){
deni = deni + s[i];
i++;
}
den = stoi(deni);
// cout << "stoi(num) " << num << "...stoi(den)" << den << endl;
}
void simplify(int& v, int& d){
if(v == 0){
d = 1;
return;
}
else if(v == d){
v = 1;
d = 1;
return;
}
int i = 2;
while(i < max(v, d)){
if(v%i == 0 && d%i == 0){
v = v/i;
d = d/i;
}
else{
i++;
}
}
}
void solve(string& s1, string s2){
if(s1.size() == 0){
s1 = s2;
return;
}
int n1, n2, d1, d2;
getValues(s1, n1, d1);
getValues(s2, n2, d2);
int d = d1*d2, v = n1*d2 + n2*d1;
simplify(v, d);
s1 = to_string(v) + "/" + to_string(d);
}
string fractionAddition(string expression) {
string ans = "";
int i = 0, n = expression.size();
while(i < n){
string temp = get(expression, i);
solve(ans, temp);
// cout << "ans " << ans << "...temp " << temp << endl;
}
return ans;
}
};