问题描述:
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。
比如,11/13=0.846153846153\ldots11/13=0.846153846153… 其循环节为846153共有 6 位。
代码框中的代码可以求出循环节的长度,把空缺的代码填好。
样例输入
11 13
样例输出
6
代码及解析:
#include <iostream>
#include <algorithm>//一些常用算法STL
#include <vector>//动态数组STL
using namespace std;
//函数f:对被除数n与除数m的处理
int f(int n, int m) {
//11
//n==0
n = n % m;//得到余数
vector<int> v;//构建int类型的动态数组v
for(;;) { //for语句不加任何限制,不断循环,一定会有结果出现
v.push_back(n);//在数组最后添加余数:11-6-8-2-7-5---11-6-8-2-7-5
n *= 10;//想想自己作除法
n = n % m;//是如何获得余数的
//现在n值为 6
if (n == 0) return 0;//如果余数仍然为0,则长度为0
//find:相当于一个指针,从v这个动态数组的开头查找第一次出现n这个目标字符串,一直查到数组尾部
//
//因为是动态数组,它的大小不断发生变化
//cout<<v.size()<<endl;
//
//动态数组值为11 n=6 find(begin,end,6)==end size=1
//动态数组值为11-6 n=8 find(begin,end,8)==end size=2
//动态数组值为11-6-8 n=2 find(begin,end,2)==end size=3
//动态数组值为11-6-8-2 n=7 find(begin,end,7)==end size=4
//动态数组值为11-6-8-2-7 n=5 find(begin,end,5)==end size=5
//动态数组值为11-6-8-2-7-5 n=11 find(begin,end,11)!=end size=6
if (find(v.begin(), v.end(), n) != v.end()) {
// 在下面填入代码,这个代码主要计算循环节长度的
/*可以查看值:使用迭代器访问元素
vector<int>::iterator it;
for(it=v.begin();it!=v.end();it++)
cout<<*it<<" "<<v.size()<<endl;
cout<<endl;
cout<<*find(v.begin(), v.end(), n)<<endl;#0
*/
return v.size() - (find(v.begin(), v.end(), n) - v.begin());
// 7-(1-0)=6
//返回值为6
}
}
}
int main() {
int n, m;
cin >> n >> m;
cout << f(n, m) << endl;
return 0;
}