蒟蒻求助,爆long long
  • 板块P1572 计算分数
  • 楼主Justskr
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/24 15:48
  • 上次更新2024/11/24 17:31:24
查看原帖
蒟蒻求助,爆long long
772284
Justskr楼主2024/11/24 15:48
#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,如何改正?

玄关求助

2024/11/24 15:48
加载中...