SSL P2628 2012年佛山市GDOI选拔赛题 循环小数

来源:互联网 发布:java断点续传下载 编辑:程序博客网 时间:2024/04/29 12:44

题目大意:
给出一个循环小数X,X = 0.a1a2…an(b1b2…bm)。 (b1b2…bm)代表小数的循环节。例如:0.5 = 0.50 = 0.5(0) = 0.5(00) = 1/2, 0.3(3) = 0.333(33) = 1/3。求将这个循环小数转化为分数形式A/B(A和B的公约数必须为1)。

题解:
脑补了一波数学方法……
要化简混循环小数化分数。
1.把不循环部分+循环部分(字符串相加),然后化成整数,减去不循环部分,得出数值为分子。
例:不循环部分为123,循环节为33,则123+33为12333,减去不循环部分,123,为12333-123
2.N个9(数量为循环节长度)+M个0(数量为不循环部分长度)组成分母(9优先放)。
例:不循环部分为34,循环节为233,则3个9+2个0为99900。
3.求出分子分母,用辗转相除法求gcd,然后化简。

var    n,m,x,y,p,q,r:int64;    i:longint;function gcd(a,c:int64):int64;begin     if a mod c=0 then exit(c)                  else exit(gcd(c,a mod c));end;begin     readln(n,m);     readln(x);     readln(y);     p:=x;     for i:=1 to m do         begin              p:=p*10;              q:=q*10+9;         end;     p:=p+y-x;     for i:=1 to n do q:=q*10;     r:=gcd(p,q);     writeln(p div r,' ',q div r);end.
1 0