#5 Wa 了
#include <iostream>
#include <iomanip>
int M, N;
double R;
int GCD(int A, int B) {
if (A == 0) return B;
if (B == 0) return A;
return GCD(B, A % B);
}
struct FracClass {
int Numerator, Denominator;
double Num() const {
return double(Numerator) / double(Denominator);
}
void Set(int X) {
Numerator = X;
Denominator = 1;
}
};
int main() {
std::cin >> M >> N >> R;
if (int(R) == R) {
std::cout << R << "/1\n";
return 0;
}
FracClass FracL = {0, 0}, FracR = {0, 0};
FracL.Set(int(R));
FracR.Set(int(R) + 1);
double Max = R;
bool Flag = false;
FracClass Ans = {0, 1};
while (true) {
FracClass NewFrac = {FracL.Numerator + FracR.Numerator, FracL.Denominator + FracR.Denominator};
// std::cout << FracL.Numerator << '/' << FracL.Denominator << '\n';
// std::cout << FracR.Numerator << '/' << FracR.Denominator << '\n';
// std::cout << NewFrac.Numerator << '/' << NewFrac.Denominator << ' ' << std::fixed << std::setprecision(10)
// << Max << '\n';
// std::cout << std::fixed << std::setprecision(10) << NewFrac.Num() << '\n';
if (NewFrac.Numerator > M || NewFrac.Denominator > N) break;
if (std::abs(NewFrac.Num() - R) == Max) {
Flag = true;
}
if (std::abs(NewFrac.Num() - R) < Max) {
Ans = NewFrac;
Max = std::abs(NewFrac.Num() - R);
// if (Max == 0) break;
Flag = false;
}
if (NewFrac.Num() < R) {
FracL = NewFrac;
} else FracR = NewFrac;
}
if (Flag) std::cout << "TOO MANY\n";
else std::cout << Ans.Numerator << '/' << Ans.Denominator << '\n';
return 0;
}
求助