洛谷 P1572 计算分数
题目描述
Csh被老妈关在家里做分数计算题,但显然他不愿意坐这么多复杂的计算。况且在家门口还有Xxq在等着他去一起看电影。为了尽快地能去陪Xxq看电影,他把剩下的计算题交给了你,你能帮他解决问题吗?
输入输出格式
输入格式:
输入一行,为一个分数计算式。计算式中只包含数字、’+’、’-‘、’/’。其中’/’为分数线,分数线左边为分子,右边为分母。输入数据保证不会出现繁分数。如果输入计算式的第一项为正,不会有前缀’+’号;若为负,会有前缀’-‘号。
所有整数均以分数形式出现。
输出格式:
输出一行,为最后的计算结果(用最简分数或整数表示)
输入输出样例
说明
对于所有测试点,输入计算式长度在100以内,分子、分母在1000以内。
思路:模拟。
错因:分母通分的时候,直接乘,爆掉了long long,应该改成最小公倍数。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int tot; long long ans=1,ans1; string s; struct nond{ int first,second,pos; }v[101]; int gcd(long long x,long long y){ return x==0?y:gcd(y%x,x); } int main(){ cin>>s; if(s[0]!='-') s='+'+s; int len=s.length(),sum=0; for(int i=0;i<len;i++){ if(s[i]>='0'&&s[i]<='9') sum*=10,sum+=s[i]-'0'; else{ if(s[i]=='/') v[tot].first=sum; else{ v[tot].second=sum; if(s[i]=='+') v[++tot].pos=1; else if(s[i]=='-') v[++tot].pos=-1; }sum=0; } } v[tot].second=sum; ans=v[1].second; for(int i=2;i<=tot;i++) ans=(v[i].second*ans)/gcd(v[i].second,ans); for(int i=1;i<=tot;i++){ int GCD=gcd(v[i].first,v[i].second); v[i].first/=GCD;v[i].second/=GCD; v[i].first*=ans/v[i].second; ans1+=v[i].pos*v[i].first; } if(ans/gcd(ans,abs(ans1))==1) cout<<ans1/gcd(abs(ans1),ans); else cout<<ans1/gcd(abs(ans1),ans)<<"/"<<ans/gcd(abs(ans1),ans); }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。