USACO 2.4.5 Fractions to Decimals
1791 ワード
構想:2つの数を除いた過程をシミュレートし、商の一人一人を1つの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;
}