任意一个分数都是有理数,对于任意一个有限小数,我们都可以表示成一个无限循环小数的形式(在其末尾添加0),对于任意一个无限循环小数都可以转化成一个分数。现在你的任务就是将任意一个无限循环小数转化成既约分数形式。所谓既约分数表示,分子和分母的最大公约数是1。
任意一个分数都是有理数,对于任意一个有限小数,我们都可以表示成一个无限循环小数的形式(在其末尾添加0),对于任意一个无限循环小数都可以转化成一个分数。现在你的任务就是将任意一个无限循环小数转化成既约分数形式。所谓既约分数表示,分子和分母的最大公约数是1。
有多组数据。
每组数据一行。输入为0.a1a2a3...ak(b1b2...bm)的形式,其中a1a2a3...ak为非循环部分,(b1b2b3..bm)为循环部分。数据保证非循环部分的长度k和循环部分的长度m不会超过8.
对于每组测试数据输出A/B,其中A是分子,B是分母,A,B均为整数。
当时比赛没做出来= =|| ,直接贴一下大牛的分析:
p = 0.a1a2a3...ak(b1b2...bm)
A = p*10^k = a1a2a3...ak.(b1b2...bm)
B = p*10^(k+m) = a1a2a3...akb1b2...bm.(b1b2...bm)
于是得B-A = p(10^(k+m)-10^(k))为整数
p = (B-A)/(10^(k+m)-10^(k));
直接辗转相除 化为最简形式
Code:
#include <algorithm> #include <iostream> #include <cstring> #include <string> #include <cstdio> #include <vector> #include <queue> #include <cmath> #include <map> #include <set> #define eps 1e-7 #define LL long long #define pb push_back #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; char a[15],b[15],s[25]; LL gcd(LL a,LL b) { return b?gcd(b,a%b):a; } int main() { while(scanf("%s",s)!=EOF){ int len=strlen(s); int l1=0,l2=0; int i; for(i=2;i<len&&s[i]!='(';i++) { a[l1++]=s[i]; } for(i++;i<len&&s[i]!=')';i++) { b[l2++]=s[i]; } LL A=0,B=0,ma=1,mb=1; for(i=0;i<l1;i++) { A=A*10+a[i]-'0'; ma*=10; } for(i=0;i<l2;i++) { B=B*10+b[i]-'0'; mb*=10; } if(!B) { LL g=gcd(A,ma); printf("%lld/%lld\n",A/g,ma/g); continue; } B=A*mb+B; mb*=ma; LL g=gcd(B-A,mb-ma); printf("%lld/%lld\n",(B-A)/g,(mb-ma)/g); } return 0; } /************************************************************** Problem: 1303 User: Roney Language: C++ Result: Accepted Time:0 ms Memory:1480 kb ****************************************************************/