输入样例45 56时的输出错误,其他可能也有错误,但我没找到原题目,没有提交测试
int a[1000000], yu[1000000] = {0}, yy[1000000];
//a数组记录结果,用于输出
//yu数组:记录余数是否出现过,e.g.yu[34]==1代表出现过34这个余数
//yy数组:顺序记录出现的余数,用于查找f1的位置
int main()
{
int z, m, zheng, i, f1, f2, l;
scanf("%d %d", &z, &m);//z分子 m分母
zheng = z / m;//整数部分
z = z % m; //化为真分数(取余)
if (z == 0)//如果余数为0
{
printf("%d.0", zheng);//直接输出结果
return 0;
}
f1 = f2 = -1;//f1、f2分别为开始和结束循环的位置(小数点后的位置)
for (l = 0; l <= 1e7+10; l ++)//位置从0开始
{
z *= 10;//更新分子(被除数)
a[l] = z / m;//竖式除法记录结果
z %= m;
yy[l] = z;//依次记录余数
if (z == 0)//出现了整除现象,除法结束
break;
if (yu[z] == 1)//如果该余数已出现过
{
f2 = l - 1;//循环的右端点
for (i = 0; i <= l - 1; i ++)
if (yy[i] == z)
{
f1 = i;//循环的左端点
break;
}
break;
}
yu[z] = 1;//记录该余数存在过
}
//printf("f1:%d f2:%d l:%d\n", f1, f2, l);
printf("%d.", zheng);//输出整数部分
for (i = 0; i <= l; i ++)//输出小数部分
{
if (i == f1)
printf("(");
printf("%d", a[i]);
if (i == f2)
{
printf(")");
break;
}
}
return 0;
}
using namespace std;
int main()
{
int a[1000];
int yu[1000] = {0};
int yy[1000];
int z, m, zheng, i, f1, f2, l;
z = 45;
m = 56;
zheng = z / m;//整数部分
z = z % m; //化为真分数(取余)
if (z == 0)//如果余数为0
{
cout << "The result is " << zheng << " !" << endl;//直接输出结果
return 0;
}
f1 = f2 = -1;//f1、f2分别为开始和结束循环的位置(小数点后的位置)
for (l = 0; l <= 1e7+10; l ++)//位置从0开始
{
z *= 10;//更新分子(被除数)
a[l] = z / m;//竖式除法记录结果
z %= m;
yy[l] = z;//依次记录余数
if (z == 0)//出现了整除现象,除法结束
break;
if (yu[z] == 1)//如果该余数已出现过
{
f2 = l - 1;//循环的右端点
for (i = 0; i <= l - 1; i ++)
if (yy[i] == z)
{
f1 = i;//循环的左端点
break;
}
break;
}
yu[z] = 1;//记录该余数存在过
}
cout << "f1:" << f1 << " f2:" << f2 << " l:" << l << endl;
cout << zheng << ".";
for (i = 0; i <= l; i ++)//输出小数部分
{
if (i == f1){
cout << "(";
}
cout << a[i];
if (i == f2)
{
cout << ")";
break;
}
}
cout << endl;
return 0;
}