/*高精度除法器 v0.1 Author:star date:2010
*可以计算无限循环小数,循环部分用括号表示
*因为整数除法最终肯定会循环,所以输出是有穷的
*一些例子:
*1/3 = 0.(3)
*22/5 = 4.4
*1/7 = 0.(142857)
*2/2 = 1.0
*3/8 = 0.375
*输入格式:数字1+/字符+数字2+回车
*输入例子:45/56
*输出结果:0.803(571428)
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <memory.h>
#define BIT 100000 //除数与被除数范围都为100000
int main(void)
{
int N, D, Mods[BIT+100];
char Ans[BIT+100];
int i, j, st, ed, mod, cnt, Flag, tp , bt;
char PreChar[100];
NEXT:
memset(Mods, 0, sizeof(Mods)); //初始化内存
memset(Ans, 0, sizeof(Ans));
memset(PreChar, 0, sizeof(PreChar));
scanf("%d/%d", &N, &D); //输入
assert(N >= 1 && N <= BIT); //输入限制的数字和范围
assert(D >= 1 && D <= BIT);
Mods[N] = cnt = Flag = 1; //初始化
if(!(N % D)) //整除了直接输出
{
printf("%d.0\n", N/D);
goto NEXT;
}
if(N < D) //计算小数点前
{
PreChar[0] = '0';
PreChar[1] = '.';
}
else
{
tp = N / D;
bt = log10(tp);
PreChar[bt+1] = '.';
for(i = bt; i >= 0; --i)
{
PreChar[i] = tp % 10 + '0';
tp /= 10;
}
N %= D;
PreChar[i] = '.';
}
i = 0;
mod = 100009; //Magic Number
while (!Mods[mod]) { //计算小数点后的除法
Mods[mod] = cnt;
++cnt;
N *= 10;
Ans[i++] = N / D + '0';
N = mod = N % D;
}
//寻找开始循环与结束循环
ed = cnt - 1;
st = Mods[mod];
//整除清0
if(Ans[ed-1] == '0' && Mods[0])
{
Flag = 0;
Ans[ed-1] = '\n';
}
//输出
printf("%s", PreChar);
for(j = 0,i = 1; i < st; ++i)
if(Ans[i-1])
printf("%c", Ans[i-1]);
if(Flag)
printf("(");
for(j = i; Ans[j-1]; ++j)
printf("%c", Ans[j-1]);
if(Flag)
printf(")\n");
goto NEXT;
}