模拟题,将分数转换成带循环节小数形式。
模拟小学算术方法即可。
用一个char数组存储结果。用一个int数组来存储当余数为i时,i除以被除数得到的余数在char数组的索引值。
如果某余数重复出现,说明出现了循环。从该余数第一次出现开始表示循环节即可。只是输出比较麻烦,要小心处理。
#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;
}