模拟长除法的计算过程,其中每一位除法时都有被除数和余数,当被除数出现重复时就表示出现循环节了,所以需要记录每一位的被除数及其在循环小数中的位置,需要注意当除数不够除,每一次补零也需要记录其相应的位置。
#include<iostream> #include<cstdio> #include<map> using namespace std; map<int,int>pos; void solve(int n,const int d,string& ans,int& r) { ans="."; pos.clear(); while(true){ n*=10; int p=pos[n]; if(p==0){ pos[n]=ans.size(); }else{ r=ans.size()-p; if(r>50){ ans.erase(p+50); ans+="..."; } ans.insert(p,"("); ans+=")"; break; } if(n<d){ ans+="0"; continue; } int div=n/d,mod=n%d; ans+=(char)(div+'0'); n=mod; if(n==0){ ans+="(0)"; break; } } } int main() { int a,b; while(scanf("%d%d",&a,&b)==2){ string ans=".(0)"; int r=1; if(a%b){ solve(a%b,b,ans,r); } printf("%d/%d = %d%s\n",a,b,a/b,ans.c_str()); printf(" %d = number of digits in repeating cycle\n\n",r); } return 0; }