题目:给你一个分数的分子和分母,求出他的循环节。
分析:模拟。根据鸽巢原理,设分母为m则计算中最多有m中不同的余数,所以循环节小于m。
说明:每次记录余数*10在取新的余数即可。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int n,m;
int save[1001];
int used[1001];
int first[1001];
int main()
{
while (~scanf("%d%d",&n,&m) && n+m) {
memset(used, 0, sizeof(used));
int count = 0;
while (!used[n] && n) {
used[n] = 1;
save[count] = 10*n/m;
first[n] = count ++;
n = 10*n%m;
}
printf(".");
for (int i = 0; i < count; ++ i) {
if (i%50 == 49) printf("\n");
printf("%d",save[i]);
}
if (!n)
printf("\nThis expansion terminates.\n\n");
else
printf("\nThe last %d digits repeat forever.\n\n",count-first[n]);
}
return 0;
}