题目:
给出一个循环小数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个正整数a1a2...an。
第三行有m个正整数b1b2...bm。
输入样例:
4 2
3333
33
输出样例:
给出一个循环小数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
解题思路:
循环小数转分数是有方法的:
纯循环小数:
小数部分循环节有几位数,分母部分就写几个9,分子为原小数部分的循环节。例:0.1……=1/9;0.1212……=12/99=4/33,0.135135……=135/999
混循环小数:
循环节部分同上,只是循环节首位数字处于多少分位,就除以多少,再乘以10;非循环部分的数字做分子,最后一位处于几分位,分母就是几。
代码:
var
n,i,j,l,m,z:longint;
t,k,ans:int64;
function gcd(x,y:int64):int64;
begin
if x mod y=0 then exit(y)
else gcd:=gcd(y,x mod y);
end;
begin
readln(n,m);
readln(i,j);
z:=m;
t:=9;
for l:=1 to m-1 do
t:=t*10+9;
for l:=1 to n do
t:=t*10;
k:=i;
for l:=1 to m do
k:=k*10;
k:=k+j-i;
ans:=gcd(k,t);
writeln(k div ans,' ',t div ans);
end.