余数检测法:
模拟除法,比如我们要计算1/7这个小数的循环节,求第一组的余数r,不难得r=1%7=1,然后将r*10继续取余 r=(1×10)%7=3,每次求出一组余数的数据,我们需要判断一下:所求出的余数之前有没有出现过,只有余数出现过,那就说明循环节出现了,(余数为0时,说明不循环),然后我们记录循环节的位置pos(第一次出现的位置),在之后把从0到pos(不包括pos)之前的数据单独输出,这一部分是不循环的,然后从pos到最后的部分单独输出,这一部分是循环的。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int fun(int n, int m) {//余数检测法求循环结长度
n = n % m;
vector<int> v;
for (;;) {
v.push_back(n);
n *= 10;
n = n % m;
if (n == 0) return 0;//不循环
if (find(v.begin(), v.end(), n) != v.end()) {//pos位前面不循环,pos位到最后循环
return v.size() - (find(v.begin(), v.end(), n) - v.begin());//迭代器相减得到长度
}
}
}
int main() {
int n, m;
cin >> n >> m;//计算n/m的循环结长度
cout << fun(n, m) << endl;
return 0;
}