USACO 2.4 分数化小数

Description

写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。 
如果小数有循环节的话,把循环节放在一对圆括号中。例如, 
1/3 = .33333333 写成0.(3) 
41/333 = 0.123123123... 写成0.(123) 
用xxx.0 成表示整数 
典型的转化例子: 
1/3 = 0.(3) 
22/5 = 4.4 
1/7 = 0.(142857) 
2/2 = 1.0 
3/8 = 0.375 
45/56 = 0.803(571428) 

Input

单独的一行包括被空格分开的 N和D, 1 <= N,D <= 100000。

Output

小数的表示方法上面说的很明白了,如果输出的长度超过76个字符,每行输出76个。最后一行有回车。

Sample Input

 

45 56

 

Sample Output

 

0.803(571428)


解题思路:先读入数据,把它的商转化为字符串,如果n=0则直接输出x.0,结束整个程序,在while循环中把循环节提出来,放入数组,再放入字符串,并且在恰当的位置加上括号,最后输出这个字符串即可。


程序:
var
  ans,s,x:ansistring;
  m:array[-1..1000000]of longint;
  n,d,i,j:longint;
begin
  readln(n,d);
  str(n div d,s);
  n:=n mod d;
  if n=0 then
    begin
      writeln(s+'.0');
      halt;
    end;
  ans:=s+'.';
  s:='';
  m[n]:=-1;
  while n<>0 do
    begin
      str(n*10 div d,x);
      s:=s+x;
      inc(i);
      j:=n*10 mod d;
      if m[j]<>0 then break;
      m[j]:=i;
      n:=j;
    end;
  if n=0 then ans:=ans+s
    else ans:=ans+copy(s,1,m[j])+'('+copy(s,m[j]+1,i-m[j])+')';
  for i:=1 to length(ans)-1 do
    if i mod 76=0 then writeln(ans[i])else write(ans[i]);
  writeln(ans[length(ans)]);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值