2 条题解
-
1
一样情况
#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); }
-
1
服了,100错误,两个还错的不一样。.....
#include<bits/stdc++.h> using namespace std; #define ll long long #define rep(i,a,b) for(ll i=a;i<=b;++i) #define dwn(i,a,b) for(ll i=a;i>=b;--i) template <typename T> inline void rd(T &x){ x=0;char c=getchar();int f=0; while(!isdigit(c)){f|=c=='-';c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();} x=f?-x:x; } #define mem(a,b) memset(a,b,sizeof(a)) int a,b,c,d; int ans1;//分子 int ans2;//分母 int main(){ scanf("%d/%d",&a,&b); while(scanf("%d/%d",&c,&d)!=EOF){ int gcd=__gcd(b,d); int lcm=b*d/gcd; ans2=lcm;//当前分母 ans1=a*(lcm/b)+c*(lcm/d);//当前分子,请读者自主模拟一下 a=ans1/(__gcd(ans1,ans2));//下一次计算时,a和b代表的是上一次计算的分子分母,顺便约个分 b=ans2/(__gcd(ans1,ans2)); } ans1=a;//最后一次处理后a就是ans1,这里赋值的原因是a与b约过一次分了 ans2=b;//最后一次处理后b就是ans2 if(ans2<0){//处理 2/-3 -> -2/3的情况 ans1=-ans1; ans2=-ans2; } if(ans2==1)printf("%d\n",ans1);//处理分母为1的情况 else printf("%d/%d\n",ans1,ans2); return 0; }
- 1
信息
- ID
- 2286
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 9
- 标签
- 递交数
- 20
- 已通过
- 3
- 上传者