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