以前做过这题,没什么特别思路,手工模拟除法即可。
问题是这蛋疼的输出格式,让我纠结了好久。
偶然看到了一个叫sprintf的逆天的东西!居然写到了50行以内啊!
庆祝一下~
C++语言: 2.4.5 fracdec
/*
PROG:fracdec
LANG:C++
*/
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXDIGIT = 100010;
char ans[MAXDIGIT];
char dec[MAXDIGIT];
int last[MAXDIGIT];
int num, den, rem, k;
int main()
{
freopen("fracdec.in", "r", stdin);
freopen("fracdec.out", "w", stdout);
memset(last, -1, sizeof(last));
scanf("%d%d", &num, &den);
sprintf(ans, "%d.", num/den);
rem = num % den;
for (int i = 0;;i++)
{
if (rem == 0)
{
if (i == 0)
sprintf(ans+strlen(ans), "%d", 0);
else
sprintf(ans+strlen(ans), "%s", dec);
break;
}
if (last[rem] != -1)
{
k = last[rem];
sprintf(ans+strlen(ans), "%.*s(%s)", k, dec, dec+k);
break;
}
last[rem] = i;
num = rem * 10;
dec[i] = num/den + '0';
rem = num % den;
}
for (int i = 0;i < strlen(ans);i += 76)
printf("%.76s\n", ans+i);
}