专栏文章
题解:P14088 [ICPC 2023 Seoul R] Fraction
P14088题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minq0drx
- 此快照首次捕获于
- 2025/12/02 06:28 3 个月前
- 此快照最后确认于
- 2025/12/02 06:28 3 个月前
一道不是很复杂的模拟。
因为涉及括号匹配,我们考虑使用栈来解决问题。若是左括号不会入栈,若是数字则直接入栈,若是右括号直接计算即可。并不需要考虑越界的问题,因为往前的所有数字都是计算后的结果。特殊地,括号不匹配就输出 。
特判方法:若栈的长度不为 就是括号不匹配,即没有足够的右括号进行计算。
另外,此题需要用 位整数,所以要开 int128。
至于分数的实现,写个结构体就行了。
AC Code:
CPP#include<bits/stdc++.h>
using namespace std;
struct node{__int128 son,mot;};
string a[105];
int n;
stack<node> s;
inline void print(__int128 n){
if(n<0){
putchar('-');
n*=-1;
}
if(n>9) print(n/10);
putchar(n % 10 + '0');
}
__int128 turn(string x){
__int128 ans=0;
for(int i=0;i<x.length();++i) ans=ans*10+int(x[i]-'0');
return ans;
}
node add(node x,node y){
node u;
u.son=x.son*y.mot+x.mot*y.son,u.mot=x.mot*y.mot;
__int128 gcd=__gcd(u.son,u.mot);
return {u.son/gcd,u.mot/gcd};
}
node div(node x,node y){
node u;
u.son=x.son*y.mot,u.mot=x.mot*y.son;
__int128 gcd=__gcd(u.son,u.mot);
return {u.son/gcd,u.mot/gcd};
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i){
if(a[i]==")"){
node x,y,z;
z=s.top();
s.pop();
y=s.top();
s.pop();
x=s.top();
s.pop();
s.push(add(x,div(y,z)));
}else if(a[i]=="(") continue;
else s.push({turn(a[i]),1});
}
if(s.size()==1){
print(s.top().son);
cout<<" ";
print(s.top().mot);
}else cout<<-1;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...