2 条题解

  • 3
    @ 2024-7-26 9:27:15

    一样情况

    #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);
    }
    
  • 3
    @ 2024-7-26 9:26:35

    服了,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
标签
递交数
13
已通过
2
上传者