#include using namespace std; int main() { int r[3005], s[3005], u[3005]; int n, m; while (scanf("%d%d", &n, &m) != EOF) { memset(r, 0, sizeof(r)); memset(u, 0, sizeof(u)); int cnt = 0; int t = n; r[cnt++] = n / m;///小数点以前的数值 n = n % m;///计算余数 //!u[n]在我看来是想求循环节的长度,就是求一个相同的余数出现的次数是否超过两次 while (!u[n] && n) { //存除数对应的循环小数位置,为了找到循环节的长度 u[n] = cnt; s[cnt] = n;//存循环小数位置对应的除数,为了找到循环节的开始位置输出( r[cnt++] = 10 * n / m;///得到余数 n = n * 10 % m;///得到新除数 } printf("%d / %d = %d", t, m, r[0]); printf("."); for (int i = 1; i < cnt && i <= 50; i++) { if (s[i] == n)printf("("); printf("%d", r[i]); } if (cnt > 50)printf("..."); if (!n)printf("0"); printf(")\n"); printf(" %d = number of digits in repeating cycle", !n ? 1 : cnt - u[n]); } return 0; }