第2题 循环小数
提交文件:float.pas/.cpp
输入文件:float.in
输出文件:float.out
给出一个循环小数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)
输入格式:
第一行有两个正整数n, m。
第二行有n个正整数a1a2...an。
第三行有m个正整数b1b2...bm。
输出格式:
输出两个正整数A和B,用空格隔开,表示分数A/B。
输入样例:
4 2
3333
33
输出样例:
1 3
数据范围:
对于20%数据 1 ≤n, m ≤ 6
对于所有数据 1 ≤ n, m≤ 8
题解:对于一个无限循环小数化成分数:
例:0.121(13)
0.1211313*100000=12113.13 0.12113*100=121.13
0.121(13)*(100000-100)=11992
0.121(13)=11992/99900
多举几例再加上简单思考可以发现
分子:不循环部分接一个循环节-不循环部分(12113-121)
分母:不循环部分数量的9+循环节数量的0
gcd化简一下即可
const
inf='float.in';
ouf='float.out';
var
fz,fm,x,y,z:int64;
st1,st2,st,ans:string;
len1,len2,di,i,n,m:longint;
function gcd(a,b:int64):int64;
begin
if a mod b=0 then exit(b)
else gcd:=gcd(b,a mod b);
end;
begin
assign(input,inf);reset(input);
assign(output,ouf);rewrite(output);
readln(n,m);
readln(st1);len1:=length(st1);
readln(st2);len2:=length(st2);
st:=st1+st2;
val(st1,x);val(st2,y);val(st,z);
fz:=z-x;
ans:='';
for i:=1 to len2 do
ans:=ans+'9';
for i:=1 to len1 do
ans:=ans+'0';
val(ans,fm);
di:=gcd(fz,fm);
fz:=fz div di;fm:=fm div di;
writeln(fz,' ',fm);
close(input);close(output);
end.