循环节
循环节
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int f(int n, int m)
{
n = n % m;
//小数位数不定故采用vector容器存储余数
vector<int> v;
for (;;)
{
v.push_back(n);
n *= 10;
n = n % m;
if (n == 0) return 0;
//find返回迭代器,返回找到的第一个位置,找不到则返回v.end(),v.end()为结尾空,其前一位为最后一个元素,v.begin()为第一个元素的位置【相当于数组下标0】
/*注意考虑类似7/18=0.388888888的情况,此类情况下find不在数组下标0处,循环节长度必为1,
故需将向量长度减去find的位置和v.begin()之差【下标相当于从0开始计算】,其余情况find位置必然等于begin*/
if (find(v.begin(),v.end(),n)!= v.end())
return int(v.size() - (find(v.begin(), v.end(), n) - v.begin()));
/*或int(v.end() - find(v.begin(), v.end(), n))此时考虑的是7/18=0.388888888的情况下end位置和find位置必然相邻
,即相差1,也就是循环节长度;其余情况find等于begin即v.end()-v.begin()也就是v.size()*/
}
//以上两种写法实际上等价,因为v.size()=v.end()-v.begin()
}
int main() {
for(int i=1;i<1000;i++){
for(int j=1;j<1000;j++){
int ret=f(i,j);
if(ret>50){
printf("i= %d,j=%d,ret=%d\n",i,j,ret);
}
}
}
}
输出循环节
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int b[105],c[105];
bool p1;
int main()
{
int i,j,j1,j2,p,q;
cin>>q>>p;j=1;p1=true;b[j]=q;j1=0;
while(q>0 && p1)
{
j1++;c[j1]=q*10/p;q=q*10-c[j1]*p;
if(q>0)
{
j2=1;
while(b[j2]!=q && j2<=j) j2++;
if(b[j2]==q)
{
p1=false;cout<<"0.";
for(i=1;i<j2-1;i++) cout<<c[i];
cout<<'{';
for(i=j2;i<=j1;i++) cout<<c[i];
cout<<'}';
}
else { j++;b[j]=q;}
}
if(q==0)
{
cout<<"0.";
for(i=1;i<=j1;i++) cout<<c[i];
cout<<endl;
}
}
return 0;
}
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习