写一个程序,输入一个形如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)
PROGRAM NAME: fracdec
INPUT FORMAT
单独的一行包括被空格分开的 N和D, 1 <= N,D <= 100000。
SAMPLE INPUT (file fracdec.in)
45 56
OUTPUT FORMAT
小数的表示方法上面说的很明白了,如果输出的长度超过76个字符,每行输出76个。
SAMPLE OUTPUT (file fracdec.out)
如果小数有循环节的话,把循环节放在一对圆括号中。例如,
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)
PROGRAM NAME: fracdec
INPUT FORMAT
单独的一行包括被空格分开的 N和D, 1 <= N,D <= 100000。
SAMPLE INPUT (file fracdec.in)
45 56
OUTPUT FORMAT
小数的表示方法上面说的很明白了,如果输出的长度超过76个字符,每行输出76个。
SAMPLE OUTPUT (file fracdec.out)
0.803(571428)
题解:
这题只需要用一个简单的模拟就行了,首先,我们先算出整数部分,这个我就不说了吧。。
然后就要到小数部分了,我们按照平时的方法手算,肯定要把余数*10,再 div 下一个数,继续做。
但是我们要看他是不是循环小数,不需要每一次都判断,只需要记录下这个位置,再这个bz【余数的】的位置,
每次判断它是否存在过,如果存在,就加个括号就行了。
代码:
var
n,d,len,s1,i,j,l:longint;
bz:array[0..10000000] of longint;
s:ansistring;
begin
readln(n,d);
str(n div d,s);
l:=length(s);
s:=s+'.';
s1:=n mod d;
bz[s1]:=1;
len:=1;
if s1=0 then insert('0',s,length(s)+1);
while s1>0 do
begin
inc(len);
s1:=s1*10;
s:=s+(chr(s1 div d+48));
s1:=s1 mod d;
if bz[s1]<>0 then
break
else
bz[s1]:=len;
end;
if s1<>0 then
begin
insert('(',s,l+bz[s1]+1);
insert(')',s,length(s)+1);
end;
for i:=1 to length(s) do
begin
write(s[i]);
if i mod 76=0 then
writeln;
end;
end.