您的位置:首页 > 其它

USACO 2.4 分数化小数

2016-04-08 21:43 267 查看
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.41/7 = 0.(142857)2/2 = 1.03/8 = 0.37545/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
:=-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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: