2628 2012年佛山市GDOI选拔赛题 循环小数(4.1)

题目

给出一个循环小数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.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值