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;
}