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
N,D <= 100000。Output小数的表示方法上面说的很明白了,如果输出的长度超过76个字符,每行输出76个。最后一行有回车。Sample Input
45 56Sample 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.
相关文章推荐
- USACO&nbsp;2.3&nbsp;和为零
- USACO&nbsp;2.2&nbsp;派对灯
- USACO&nbsp;2.1&nbsp;健康的好斯坦奶牛
- USACO&nbsp;2.1&nbsp;顺序的分数
- USACO&nbsp;1.5&nbsp;特殊的质数肋骨
- USACO&nbsp;1.5&nbsp;回文质数
- USACO&nbsp;1.5&nbsp;数字金字塔
- USACO&nbsp;1.3&nbsp;牛式
- USACO&nbsp;1.2&nbsp;双重回文数
- USACO&nbsp;1.2&nbsp;回文平方数
- USACO&nbsp;1.2&nbsp;方块转换
- USACO&nbsp;1.2&nbsp;挤牛奶
- USACO&nbsp;1.1&nbsp;你要乘坐的飞碟在这里
- USACO&nbsp;1.1&nbsp;黑色星期五
- USACO&nbsp;1.1&nbsp;贪婪的礼物送礼者
- USACO&nbsp;1.1&nbsp;破碎的项链
- 求二叉树的后序遍历(树)
- 查找单词树(树)
- 约瑟夫问题(指针变量及线性链表)
- Android 开发知识点