写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。
例如, 1/3 =0.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。
OUTPUT FORMAT
按照上面规则计算出的小数表达式.如果结果长度大于76,每行输出76个字符.
SAMPLE INPUT
(file fracdec.in)
45 56
SAMPLE OUTPUT
(file fracdec.out)
0.803(571428)
【参考程序】:
/*
ID: XIONGNA1
PROG: fracdec
LANG: C++
*/
#include<iostream>
#include<cstring>
using namespace std;
int list[1000001];
int n,d;
string s,ans;
int main()
{
freopen("fracdec.in","r",stdin);
freopen("fracdec.out","w",stdout);
scanf("%d%d",&n,&d);
ans=""; s="";
int k; k=n/d;
if (k==0) s='0';
while (k>0)
{
s=char(k%10+48)+s;
k/=10;
}
ans=ans+s+'.';
n=n%d*10;
if (n==0) ans=ans+'0';
else
{
while (n>0 && list[n]==0)
{
list[n]=ans.length();
k=n/d;
s="";
if (k==0) s='0';
while (k>0)
{
s=char(k%10+48)+s;
k/=10;
}
ans=ans+s;
n=n%d*10;
if (list[n]>0)
ans=ans.substr(0,list[n])+'('+ans.substr(list[n],ans.length()-list[n])+')';
}
}
ans=' '+ans;
for (int i=1;i<=ans.length()-1;i++)
{
printf("%c",ans[i]);
if (i==ans.length()-1 || i%76==0) printf("\n");
}
return 0;
}