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.