题目
给出一个循环小数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,纯循环小数:小数点后有几位数,分母就有几个9,分子为一个循环节.如:0.345(345循环)=345/999 该化简就化简即可.
2,混循环小数:小数点后到第一个循环减去非循环小数部分作为分子,循环节内有几位数,分母就有几个9,然后接着写几个0,0的个数为第一个循环节前面非循环小数的位数.如:0.0231(31循环)=(0231-02)/9900 需要化简再化简.
循环小数转分数 例:0.333(33)
x:循环小数非循环部分///333
y:循环小数循环节///33
z:x+y/33333
分子:z-x//33300
分母:x长度个9,y长度个099900
最后化简
代码
var
a,b,c:string;
x,y,z,j,k,w,p,q:int64;
i,n,m:longint;
function gcd(a,b:int64):int64;
begin
if b=0 then exit(b);
if a mod b=0 then exit(b);
gcd:=gcd(b,a mod b);
end;
begin
readln(n,m);
readln(a);
readln(b);
i:=length(a);
while a[i]=' ' do begin delete(a,i,1);dec(i);end;
i:=length(b);
while b[i]=' ' do begin delete(b,i,1);dec(i);end;
c:=a+b;
val(a,x);
val(b,y);
val(c,z);
p:=z-x;
j:=9;k:=1;
for i:=2 to m do
j:=j*10+9;
for i:=1 to n do
k:=k*10;
q:=j*k;
w:=gcd(q,p);
if w=0 then writeln(p,' ',q) else writeln(p div w,' ',q div w);
end.