Problem H: 2.4.5 Fractions to Decimals 分数化小数
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 222 Solved: 22
[ Submit][ Status][ Web Board]
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)
HINT
#include <stdio.h>
#include<string.h>
#define MAX 100010
#define getint(i) scanf("%d", &i)
int
rm[MAX];
char
buf[MAX];
char
dev[MAX];
int
counter;
int
main(
void
)
{
int
m, n;
int
i;
getint(m);
getint(n);
sprintf
(buf,
"%d."
, m/n);
memset
(rm, -1,
sizeof
(rm));
m = m % n;
dev[0] =
'0'
;
for
(i = 0; ; i++){
if
(m == 0){
sprintf
(buf +
strlen
(buf),
"%s"
, dev);
break
;
}
if
(rm[m] != -1){
sprintf
(buf +
strlen
(buf),
"%.*s(%s)"
, rm[m],
dev, dev + rm[m]);
break
;
}
rm[m] = i;
m *= 10;
dev[counter++] = m / n +
'0'
;
m = m % n;
}
for
(i = 0; i <
strlen
(buf); i+=76){
printf
(
"%.76s\n"
, buf + i);
}
return
0;
}