题目来源:洛谷P1530 [USACO2.4]分数化小数 Fractions to Decimals
我的65分代码:
```c
#include <stdio.h>
int a[100010], yu[100010], yy[100010], len = 0, yu_fst;
//a数组记录结果,用于输出
//yu数组:记录余数是否出现过,e.g.yu[34]==1代表出现过34这个余数
//yy数组:顺序记录出现的余数,用于查找f1的位置
int main()
{
int fz, fm, zheng, i, f1, f2, count;
scanf("%d %d", &fz, &fm);//fz分子 fm分母
zheng = fz / fm;//整数部分
fz %= fm; //化为真分数(取余)
if (fz == 0)//如果余数为0
{
printf("%d.0", zheng);//直接输出结果
return 0;
}
yu_fst = fz % fm; // 整数部分产生的余数
f1 = f2 = -1;//f1、f2分别为开始和结束循环的位置(小数点后的位置)
for (len = 0; len <= 1e7+10; len ++)//位置从0开始
{
fz *= 10;//更新分子(被除数)
a[len] = fz / fm;//竖式除法记录结果
fz %= fm;
yy[len] = fz;//依次记录余数
if (fz == 0)//出现了整除现象,除法结束
break;
if (a[len] == 0)//考虑商为0的特殊情况
{
yy[len] == -1;
continue;
}
if (yu[fz] == 1 || fz == yu_fst)//如果该余数已出现过
{
f2 = len;//循环的右端点
if (fz == yu_fst) // 循环的左端点是第一个小数的情况
{
f1 = 0;
break;
}
for (i = 0; i < len - 1; i ++)
if (yy[i] == fz)
{
f1 = i + 1;//循环的左端点
break;
}
break;
}
yu[fz] = 1;//记录该余数存在过
}
printf("%d.", zheng);//输出整数部分
count = (int)log(zheng) + 1 + 1;
for (i = 0; i <= len; i ++)//输出小数部分
{
count ++;
if (i == f1)
printf("(");
printf("%d", a[i]);
if (i == f2)
printf(")");
if (count % 76 == 0)
printf("\n");
}
return 0;
}
```