2017.4.1测试T2 循环小数 数论

第2题 循环小数

提交文件:float.pas/.cpp

输入文件:float.in

输出文件:float.out

 

给出一个循环小数XX = 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

输出格式:

输出两个正整数AB,用空格隔开,表示分数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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值