思路:模拟除法. 判断循环节的条件是出现相同的余数 。这题让我认识到string的加减法多么的耗时间
/*
ID: xpli1
PROG: fracdec
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
#define IN fin
#define OUT fout
ifstream fin ("fracdec.in", ios::in);
ofstream fout("fracdec.out",ios::out);
int n,d;
string ans;
int mod[100001];
int mod_save[100001];
int mod_num;
int main(){
IN >> n >> d;
int z = 0;
while(n >= d){
n -= d;
z++;
}
char zz[100001];
sprintf(zz,"%d",z);
ans = zz;
if(n == 0){ans = ans + ".0";OUT << ans <<endl;}
else{
ans = ans + ".";
int len = ans.length();
int iter = 100001;
int dvd,m;
mod[n] = 1;
mod_save[mod_num++] = n;
int ch_num = 0;
while(iter--){
n *= 10;
dvd = n / d;
m = n % d;
zz[ch_num++] = '0'+dvd;
if(m == 0){OUT << ans + zz << endl; return 0;}
if(mod[m]){ break;}
mod[m] = 1;
mod_save[mod_num++] = m;
n = m;
}
int i;
for(i = 0; i < mod_num; i++){if(mod_save[i] == m) break;}
ans = ans + zz;
string s1 = ans.substr(0,i+len);
string s2 = ans.substr(len+i,mod_num-i);
ans = s1 + "(" + s2 + ")";
len = ans.length();
for(i=0; i<len; i++){
OUT << ans[i];
if((i+1)%76 == 0) OUT << endl;
}
if(len%76 != 0) OUT << endl;
}
return 0;
}