WA #5,求助
查看原帖
WA #5,求助
520777
LaoXu666楼主2023/11/7 12:05

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

求助

2023/11/7 12:05
加载中...