模擬題,將分數轉換成帶循環(huán)節(jié)小數形式。
模擬小學算術方法即可。
用一個char數組存儲結果。用一個int數組來存儲當余數為i時,i除以被除數得到的余數在char數組的索引值。
如果某余數重復出現,說明出現了循環(huán)。從該余數第一次出現開始表示循環(huán)節(jié)即可。只是輸出比較麻煩,要小心處理。
#include?<iostream>
#include?<fstream>
using?namespace?std;
ifstream?fin("fracdec.in");
ofstream?fout("fracdec.out");
#ifdef?_DEBUG
#define?out?cout
#define?in?cin
#else
#define?out?fout
#define?in?fin
#endif
int?pos[100001];
char?result[100010];
void?solve()
{
????memset(pos,-1,sizeof(pos));
????int?n,d;
????in>>n>>d;
????int?integer?=?n/d;
????int?start;
????int?cnt?=?1;
????out<<integer<<'.';
????do{
????????cnt++;
????????integer/=10;
????}while(integer);
????cnt++;
????start?=?cnt;
????n%=d;
????while(pos[n]==-1){
????????pos[n]=cnt++;
????????result[pos[n]]?=?n*10/d+'0';
????????n?=?n*10%d;
????????if(n==0)?break;
????}
????if(n==0){
????????for(int?i=start;i<cnt;++i){
????????????out<<result[i];
????????????if((i)%76==0)
????????????????out<<endl;
????????}
????????if((cnt-1)%76!=0)
????????????out<<endl;
????}else{
????????int?i;
????????for(i=start;i<pos[n];++i){
????????????out<<result[i];
????????????if(i%76==0)
????????????????out<<endl;
????????}
????????out<<'(';
????????i++;
????????if(i%76==0)
????????????out<<endl;
????????cnt++;
????????for(;i<cnt;++i){
????????????out<<result[i-1];
????????????if(i%76==0)
????????????????out<<endl;
????????}
????????out<<')';
????????out<<endl;
????}
}
int?main(int?argc,char?*argv[])
{
????solve();?
????return?0;
}