P2399 non hates math
将分数化成小数的模拟题,把循环减掉就可以了。
1.1(234)
*10^4==11234.234
*10^1==11.234
9999*(1.1(234))==11223
所以
(1.1(234))==11223/9999
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#define inf 2147483647
#define For(i,a,b) for(register long long i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar()
//by war
//2017.10.23
using namespace std;
char a[];
long long len;
long long fenzi,fenmu,zi,mu;
long long g,s;
bool flag; void in(long long &x)
{
long long y=;
char c=g();x=;
while(c<''||c>'')
{
if(c=='-')
y=-;
c=g();
}
while(c<=''&&c>='')x=x*+c-'',c=g();
x*=y;
}
void o(long long x)
{
if(x<)
{
p('-');
x=-x;
}
if(x>)o(x/);
p(x%+'');
} long long gcd(long long a,long long b)
{
return (b==?a:gcd(b,a%b));
} long long ksm(long long a,long long b)
{
if(b==)
return ;
while(b%==)
{
b>>=;
a=a*a;
}
long long r=;
while(b>)
{
if(b%==)
r=r*a;
b>>=;
a=a*a;
}
return r;
} int main()
{
cin>>a;
len=strlen(a);
For(i,,len-)
if(a[i]!='.')
fenzi=fenzi*+a[i]-'';
else
{
s=i+;
break;
}
fenmu=ksm(,len-s);
For(i,s,len-)
{
if(a[i]=='(')
{
flag=true;
mu=ksm(,i-s);
zi=fenzi;
}
if(a[i]!='('&&a[i]!=')')
{
fenzi=fenzi*+a[i]-'';
if(!flag)
zi=zi*+a[i]-'';
}
}
if(!flag)
{
zi=;
mu=;
}
else
{
fenmu/=;
}
fenzi-=zi;
fenmu-=mu;
g=gcd(fenzi,fenmu);
fenzi/=g;
fenmu/=g;
o(fenzi),p('/'),o(fenmu);
return ;
}