模拟赛 循环小数

题目:
    给出一个循环小数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.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值