出现余数相同的情况就会有循环节,存一下余数出现时的商的下标,等一下再出现这个余数时,两个余数下标之间的商就是循环节。
ac代码
#include<bits/stdc++.h>
#include<bitset>
#include<unordered_map>
#define pb push_back
#define bp __builtin_popcount
#define TIME cout << "RuningTime: " << clock() << "ms\n", 0
#define ls x<<1
#define rs x<<1|1
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1e6+10;
const int MOD=9901;
const int mod = 1e9+7;
const double PI=3.14;
int lowbit(int x){return x&-x;}
ll gcd(ll x, ll y){ return y == 0 ? x : gcd(y, x%y); }
ll lcm(ll x, ll y){ return x / gcd(x, y)*y; }
inline ll dpow(ll a, ll b){ ll r = 1, t = a; while (b){ if (b & 1)r = (r*t) % MOD; b >>= 1; t = (t*t) % MOD; }return r; }
inline ll fpow(ll a, ll b,ll p){ ll r = 1, t = a; while (b){ if (b & 1)r = (r*t) % p; b >>= 1; t = (t*t) % p; }return r; }
priority_queue<int, vector<int>, greater<int> > q;
int mmp[maxn];
int main()
{
int n,m;
cin>>n>>m;
cout<<n/m<<".";
int d=n%m;// 1 8
if(d==0)
{
cout<<0<<endl;
return 0;
}
int ans=2;
vector<int>v;
memset(mmp,-1,sizeof mmp);
int now=0;
while(1)
{
if(d==0)//除尽了
{
for(int i=0;i<v.size();i++)
{
cout<<v[i];
ans++;
if(ans==76){
cout<<endl;
ans=0;
}
}
return 0;
}
if(mmp[d]!=-1)//当前余数出现过了
{
for(int i=0;i<=mmp[d]-1;i++)
{
cout<<v[i];
ans++;
if(ans==76){
cout<<endl;
ans=0;
}
}
cout<<"(";
ans++;
if(ans==76){
cout<<endl;
ans=0;
}
for(int i=mmp[d];i<v.size();i++)
{
cout<<v[i];
ans++;
if(ans==76){
cout<<endl;
ans=0;
}
}
cout<<")";
ans++;
if(ans==76){
cout<<endl;
ans=0;
}
return 0;
}
mmp[d]=now;//余数是d情况 mmp[1]=0;
d*=10;
v.push_back(d/m);//余数是d时,当前商 1
//上次余数出现的位置
d%=m;//2
//cout<<d<<endl;
now++;// 1
//if(map[d])break;
}
return 0;
}