开始这题我是想到的是以前奥数学的那种把循环小数化分数的...那么分母就应该是(99...00)的形式..既然如此..那么找到能被分母整除的最小(99...00)...然后再算出对应的分子..再展开成循环小数...真的很eggache阿...写了一大段..结果都没调出来..

    再一想..其实这题只要手动模拟做除法..每次记下除数和余数..再找到有相同余数的就可以了~~而且题目所给的范围<=100000..而根据鸽巢原理,最多要做的模拟运算时100001..表示完全能接受..

    有点恶心的输出...要注意...

    

Program:

/*  
ID: zzyzzy12
LANG: C++
TASK: fracdec
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
using namespace std;
int x,y,g;
int gcd(int x,int y)
{
if (y==0) return x;
return gcd(y,x%y);
}
void getanswer()
{
int p,t,i,a[100001],b[100001],num,n;
long long k;
memset(b,-1,sizeof(b));
if (x/y>0) n=(int)log10(x/y)+2;
else n=2;
printf("%d.",x/y);
x%=y;
if (y==1) { printf("0\n"); return; }
t=x; num=0; b[x]=0;
while (1)
{
t*=10;
a[++num]=t/y;
t-=a[num]*y;
if (t==0) break;
if (b[t]>=0)
{
p=b[t];
break;
}
b[t]=num;
}
if (t!=0)
{
for (i=1;i<=p;i++)
{
printf("%d",a[i]);
n++;
if (n%76==0) printf("\n");
}
printf("(");
n++;
if (n%76==0) printf("\n");
for (i=p+1;i<=num;i++)
{
printf("%d",a[i]);
n++;
if (n%76==0) printf("\n");
}
printf(")");
}else
for (i=1;i<=num;i++)
{
printf("%d",a[i]);
n++;
if (n%76==0) printf("\n");
}
if (n%76) printf("\n");
}
int main()
{
freopen("fracdec.in","r",stdin);
freopen("fracdec.out","w",stdout);
scanf("%d %d",&x,&y);
g=gcd(x,y);
x/=g; y/=g;
getanswer();
return 0;
}