SRM483 Div2 Hard(1000) BestApproximationDiv2

BestApproximationDiv2

○○Div1と○○Div2があったらDiv2の方が簡単かと思いきや、今回はDiv2の方が難しい。numberの長さがintで扱いきれないので自前で割り算を実装。O(maxDen2)では間に合わないので、Bの値からAの値を計算。

#include <string>

using namespace std;

int quality( string number, int A, int B )
{
    int n = (int)number.length() - 2;

    for ( int i=0; i<n; i++ )
    {
        A *= 10;
        if ( number[i+2] != '0' + A / B )
            return i + 1;
        A -= A / B * B;
    }

    return n+1;
}

class BestApproximationDiv2{public:
string findFraction( int maxDen, string number )
{
    double num;
    sscanf( number.c_str(), "%lf", &num );

    int aA = 0,  aB = 0,  aX = 0;

    for ( int B=1; B<=maxDen; B++ )
    {
        int t = int( B * num );

        for ( int A=max(t-1,0); A<=min(t+1,B-1); A++ )
        {
            int X = quality( number, A, B );
            if ( X > aX )
                aA = A,  aB = B,  aX = X;
        }
    }

    char ans[100];
    sprintf( ans, "%d/%d has %d exact digits", aA, aB, aX );
    return ans;
}};