提交还是wa, 怎么改啊…
参考了http://www.2cto.com/kf/201408/322120.html。
思路写在了代码注释里。
代码:
//xi 3-8 Repeating Decimals.cpp
/*第0步,分子是5,分母是7(分母在整个除法中始终不变),5/7的商是0,代表这个除法的整数部分是0,,余数是5,乘以10,得50作为第1步的分子;50/7的商为7,代表这个除法的第一位小数是7,余数是1,乘以10,得10作为第2步的分子...可以发现每步的除法只跟分子有关,也就是当分子出现重复值,如上图第1步和第7步的分子值都为50时,第7步后面的运算其实是在重复第1步至第6步间的运算。所以第1步至第7步就是一个循环节。*/
#include <cstdio>
using namespace std;
int A[2][3010], p, q;//程序实现中,可以不用存储余数的值,只需存储上
//图中的分子和商,我定义了A[2][3010],用A[0]
//[j]存储第j步的分子,
//A[1][j]存储第j步的商。注意最后的数值由商可以直接构成
int myfind() //找i位之前是否有重复分子出现;有则返回周期len,否则返
//回-1.
{
for(p = 1; p < q; p++)
{
if(A[0][p] == A[0][q])
return q - p;
}
return -1;
}
int main()
{
int kase, a, b, i, len;
for(kase = 1; scanf("%d%d", &a, &b) == 2; kase++)
{
A[0][0] = a; A[1][0] = a/b;
for(q = 1; ; q++)
{
A[0][q] = (A[0][q-1] - b*A[1][q-1])*10; //分子
//, 一直X10
//A[0]
//[q] = 10*A[0][q-1] % A[1][q-1]; //不能这样
//写, 因为这样写可能分母为0
A[1][q] = A[0][q] / b; //商
len = myfind();
if(len > 0) break;
}
printf("%d/%d = %d.", a, b, A[1][0]);
for(int i = 1; i < p; i++)
printf("%d", A[1][i]);
putchar('(');
for(int i = p; i < q; i++)
{
if(i > 50)
{
printf("...");
break;
}
printf("%d", A[1][i]);
}
printf(")\n %d = number of digits in reperting cycle\n\n", len);
}
return 0;
}
注意:其中分子是余数X10, 为避免a/b为0, 不用%符号来取得余数, 用A[0][q] = (A[0][q-1] - b*A[1][q-1])*10;