中南大学2013年8月31日 月赛
题意:小数化既约分数形式,这道题应该来自编程之美的《浮点数的精确表示》,相当于解题报告。
在这里我就不赘述了。
1.如果没有循环节或者循环节为0
X=0.a1a2a3...an(0000)
10^n*X=a1a2a3...an;
那么求最大公约数即可。
2.如果带有非0的循环节
X=0.a1a2a3...an(b1b2...bm)
10^n*X=a1a2a3...an.(b1b2...bm);
这里令Y=0.(b1b2...bm),a=a1a2a3...an,b=b1b2...bm
Y*10^m-b=Y;故Y=b/(10^m-1);
那么 X=(a*(10^m-1)+b) / 10^n*(10^m-1);
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define LL long long
LL a,b,basea,baseb;
void split(char str[])
{
int i=2;
a=b=0;
basea=baseb=1;
while(str[i]&&str[i]!='(')
{
a=a*10+(str[i]-'0');
i++;
basea*=10;
}
if(str[i]=='(')i++;
while(str[i]&&str[i]!=')')
{
b=b*10+(str[i]-'0');
i++;
baseb*=10;
}
}
LL GCD(LL n,LL m)
{
return m?GCD(m,n%m):n;
}
int main()
{
char str[30];
LL n,m;
while(~scanf("%s",str))
{
split(str);
/* if(a==0&&b==0)
{
printf("0\n");
continue;
}
*/
// (a*(baseb-1)+b)/basea*(baseb-1);
if(b==0)//存在循环节为0的情况
{
n=a;
m=basea;
}
else
{
n=a*(baseb-1)+b;
m=basea*(baseb-1);
}
LL key=GCD(n,m);
cout<<n/key<<"/"<<m/key<<endl;
}
return 0;
}