思路:模拟两数相除的过程,将商的每一位都保存在一个string中,只要出现的余数相同,就证明已经出现循环了,就可以终止计算了。然后处理存储商数的字符串,找出循环节。输出就可以了!
源代码:
/*
ID: supersnow0622
PROG: fracdec
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
#include<memory.h>
using namespace std;
int main() {
ofstream fout ("fracdec.out");
ifstream fin ("fracdec.in");
int N,D;
cin>>N>>D;
string str="";
int a,b,count;
int used[1000000];
memset(used,0,sizeof(used));
int result=N/D,num=1;
while(result/10!=0)
{
result=result/10;
num++;
}
if(N%D==0)
{
cout<<N/D<<".0";
return 0;
}
else cout<<N/D<<".";
b=N%D;
N=b*10;
a=N/D;
str+=a+'0';
while(!used[b])
{
used[b]=1;
b=N%D;
N=b*10;
a=N/D;
str+=a+'0';
}
if(!used[0])
{
int i;
for(i=0;i<str.length();i++)
if(str[i]==str[str.length()-1])
break;
count=0;
for(int j=0;j<str.length()-1;j++)
{
if(i==j){
cout<<"("<<str[j];
count+=2;
}
else if(j==str.length()-2){
cout<<str[j]<<")";
count+=2;
}
else if(j!=str.length()-2){
cout<<str[j];
count++;
}
if((count+num+1)%76==0)
cout<<endl;
}
}
else{
count=0;
for(int j=0;j<str.length();j++)
if(str[j]=='0'&&count!=0)
break;
else
{
cout<<str[j];
if(str[j]!='0')
count++;
}
}
return 0;
}