模擬除法運算,利用數組ch[]保存商值,使用post[n]表示餘數n除以d的商出如今ch[]中的位置(未出現過爲-1),沒必要再每次對出現的商s進行檢測,節約大量時間。循環進行除法運算,若是餘數n出現過即爲循環小數,n爲零則爲有限非循環小數。而後均終止除法運算,按照要求輸出結果便可。ios
/* ID:jzzlee1 PROB:fracdec LANG:C++ */ //#include <iostream> #include<fstream> #include<cstring> using namespace std; ifstream cin("fracdec.in"); ofstream cout("fracdec.out"); int e,t; int post[100001]; char ch[100010]; void cal(int a) { int i=0; do { i++; a=a/10; } while(a); i=i+2;; e=t=i; } int main() { int i,n,d,a,s,flag=0,count=0; cin>>n>>d; if(n%d==0)//整除 cout<<n/d<<".0"<<endl; else { memset(post,-1,sizeof(post)); a=n/d;n%=d; cal(a); while(1) { if(n==0) { flag=1; break; } if(post[n]==-1) { post[n]=t++; s=10*n/d; ch[post[n]]=s+'0'; n=10*n%d; } else { flag=2; break; } } cout<<a<<"."; if(flag==1) { for(i=e;i!=t;i++) { cout<<ch[i]; if(i%76==0) cout<<endl; } if((t-1)%76!=0) cout<<endl; } else if(flag==2) { for(i=e;i<post[n];++i) { cout<<ch[i]; if(i%76==0) cout<<endl; } cout<<'('; i++; if(i%76==0) cout<<endl; t++; for(;i<t;++i) { cout<<ch[i-1]; if(i%76==0) cout<<endl; } cout<<')'; cout<<endl; } } return 0; }