#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
#define dbug(x) (void)(cerr << #x " = " << x << endl)
ll fr,ba;
inline void toclear(){
ll k = __gcd(fr,ba);
fr = fr / k;
ba = ba / k;
}
inline ll lcm(ll a,ll b){
ll g = __gcd(a,b);
return a*b/g;
}
queue<ll> f,b,temp;
queue<char> c;
int main(){
//ios::sync_with_stdio(false);
//cin.tie(0),cout.tie(0);
string a;
cin >> a;
bool o = 0;
if(a[1] == '-') o = 1;
while(a.find('/') != string::npos){
ll k = a.find('/');
fr = 0;
ll N = 1;
for(ll i = k-1;i >= 0;i--){
if(!isdigit(a[i])){
break;
}
fr += (ll)(a[i]-'0') * N;
N*=10;
}
ba = 0;
for(ll i = k+1;i <= a.size();i++){
if(!isdigit(a[i])){
break;
}
ba *= 10;
ba += a[i] - '0';
}
cerr << fr << " / " << ba << endl;
toclear();
f.push(fr);
b.push(ba);
a[k] = '^';
}
for(ll i = 0;i < a.size();i++){
if(!isdigit(a[i]) && a[i] != '^'){
c.push(a[i]);
}
}
ll k = b.front();
temp = b;
while(!b.empty()){
ba = b.front();
b.pop();
k = lcm(k,ba);
}
ll cnt = 0;
ll sum = 0;
if(o) c.pop();
while(!f.empty()){
fr = f.front();
f.pop();
ba = temp.front();
temp.pop();
cnt++;
if(cnt == 1){
if(o) sum -= fr * (k/ ba);
else sum += fr * (k/ ba);
continue;
}
char t = c.front();
//dbug(t);
c.pop();
if(t == '-'){
sum -= fr * (k/ ba);
}else{
sum += fr * (k/ ba);
}
//dbug(sum);
}
ba = k;
fr = sum;
toclear();
if(ba < 0 || fr < 0) cout << '-';
if(ba == 1) cout << fr;
else cout << (ll)abs(fr) << '/' << (ll)abs(ba) << endl;
return 0;
}
求助,我是分母和分子分开计算的,所以没法做到边算边约,最后爆long long,如何改正?
玄关求助