SRM483 Div1 Easy(250) BestApproximationDiv1
A,Bの取り得る範囲を全部試しても間に合う。ただ誤差が怖い。本番の時はコメントアウトしているコードで通ったけど、例えば"%.10f"を"%.20f"とすると、
Problem: 250 Test Case: 10 Succeeded: No Execution Time: 221 ms Args: {656, "0.120014"} Expected: "3/25 has 5 exact digits" Received: "49/408 has 5 exact digits"
でアウト。
VC++では問題無かったけど、GCCだと
printf("%.20f\n",(double)3/25); = "0.11999999999999999556"。
整数で処理するべき。
#include <string> using namespace std; class BestApproximationDiv1{public: string findFraction( int maxDen, string number ) { int aA = 0; int aB = 0; int aX = -1; for ( int B=1; B<=maxDen; B++ ) for ( int A=0; A<B; A++ ) { /* char num[100]; sprintf( num, "%.10f", (double)A/B ); /*/ char num[100] = "0."; sprintf( num+2, "%06d", A*1000000/B ); //*/ int X; for ( X=0; X<8; X++ ) if ( num[X] != number[X] ) break; if ( X > aX ) aA = A, aB = B, aX = X; } char ans[100]; sprintf( ans, "%d/%d has %d exact digits", aA, aB, aX-1 ); return ans; }};