問題の解決策は、スコアP1572を[計算]

文字列良い質問!その他の説明可読性が高くありません私は再びそれを説明するのが最も簡単なアイデアを使用します

分析:

  • あなたは分子と分母からワープロに文字列を読めば非常に面倒になり、と読んだときにscanf("%d/%d",&a,&b)簡単に言葉の兆候に対処することができます
  • 共通分母:a*b=lcm(a,b)*gcd(a,b)、あまりにもlcm(a,b)=a * b/gcd(a,b)

    この質問ピット

  • 1時分母は、特別な文を必要とします
  • 我々は、彼らが__gcd引き継いでいるたびに再びGCD(a、b)は<---これは、ライブラリ関数で、ハンズフリープレイ、に数えることができる:最も簡単な整数比に結果多くの時間を節約しませんでしたが、
  • ほとんどのピットポイント:分母が負の場合、例えば2/-3になります-2/3

#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;
}

おすすめ

転載: www.cnblogs.com/sjsjsj-minus-Si/p/11635468.html