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

 

 
   

 

Sample Output

 

 
   
 
   
 
   
先读入数据,把它的商转化为字符串,如果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.

你可能感兴趣的:(USACO)