2020-5 leetcode 972. 相等的有理数

1.这个题整体思想是把给的小数化为分数来比较。
最关键的部分是利用等比级数求和来求无限循环小数部分。
注意:这里 p2 是等比的分母;
2.分数化简函数,分数相加的函数

class Solution {
     
public:
    using ll=long long;
    ll gcd(ll a,ll b){
     
        return b?gcd(b,a%b):a;
    }
    void sy(ll& n,ll& m){
     
        if(n==0||m==0){
     
            n=0;
            m=0;
        }
        ll t=gcd(n,m);
        if(t>0){
     
            n=n/t;
            m=m/t;
        }
    }
    pair<ll,ll> add(ll n1,ll d1,ll n2,ll d2){
     
        ll n,d;
        if(d1==0){
     
            n=n2;
            d=d2;
        }
        else if(d2==0){
     
            n=n1;
            d=d1;
        }
        else{
     
            n=n1*d2+n2*d1;
            d=d1*d2;

        }
        sy(n,d);
        return {
     n,d};
    }
    pair<ll,ll> trans(string s){
     
        ll int_part=0,nornep_part=0,rep_part=0,nornep_len=0,rep_len=0;
        int i=0;
        int N=s.size();
        while(i<N&&s[i]!='.'){
     
            int_part=int_part*10+s[i]-'0';
            i++;
        }
        i++;
        while(i<N&&s[i]!='('){
     
            nornep_part=nornep_part*10+s[i]-'0';
            i++;
            nornep_len++;
        }
        i++;
        while(i<N&&s[i]!=')'){
     
            rep_part=rep_part*10+s[i]-'0';
            i++;
            rep_len++;
        }
        ll p1=pow(10,nornep_len);
        ll p2=pow(10,rep_len);
        ll nornep_num=nornep_part;
        ll nornep_dom=p1;
        ll rep_num=rep_part;
        ll rep_dom=(p2-1)*p1;

        sy(nornep_num,nornep_dom);
        sy(rep_num,rep_dom);
        auto p=add(nornep_num,nornep_dom,rep_num,rep_dom);
        return add(p.first,p.second,int_part,1);

    }
    bool isRationalEqual(string S, string T) {
     
        return trans(S)==trans(T);
    }
};

你可能感兴趣的:(leetcode)