社区讨论

70pts求调

P9750[CSP-J 2023] 一元二次方程参与者 2已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@loczt9ox
此快照首次捕获于
2023/10/30 22:26
2 年前
此快照最后确认于
2023/11/02 10:36
2 年前
查看原帖
讨论区的Hack数据都过过一遍了,请问这个程序还能怎么被Hack啊(悲)
CPP
#include<bits/stdc++.h>
int num, boundary, gcdnum, tem1, tem2, tem3, coe, tem4, flag, fenmu;
long double x1, x2, last, a, b, c, d;
bool decision(long double n){
	int n2 = n / 1;
	if(n - n2 != 0){
		return false;
	}
	return true;
}
bool youlishu(long double n, bool enter = true){
	if(n == 0){
		return false;
	}
	if(decision(n)){
		std::cout << n;
		if(enter){
			std::cout << '\n';
		}
		return true;
	}
	else{
		for(int i = 2; i <= 50; i++){
			if(decision(i * n)){
				std::cout << i * n << "/" << i;
				if(enter){
					std::cout << '\n';
				}
				return true;
			}
		}
	}
	return false;
}
int wulishu(int n){
	int ma = 1;
	for(int i = 2; i * i <= n; i++){
		if(n % (i * i) == 0){
			ma = i * i;
		}
	}
	return ma;
}
int main(){
	std::cin >> num >> boundary;
	for(int i = 1; i <= num; i++){
		std::cin >> a >> b >> c;
		if(pow(b, 2) - (4 * a * c) < 0){
			std::cout << "NO" << '\n';
		}
		else{
			tem1 = b * b;
			tem2 = 4 * a * c;
			tem3 = 2 * a;
			x1 = (-b + sqrt(tem1 - tem2)) / tem3;
			x2 = (-b - sqrt(tem1 - tem2)) / tem3;
			last = std::max(x1, x2);
			if(last > boundary){
				std::cout << "NO" << '\n';
				continue;
			}
			if(youlishu(last)){
				continue;
			}
			if(last == 0){
				std::cout << 0 <<'\n';
				continue;
			}
			else{
				flag = 1;
				fenmu = 0;
				if(youlishu(-b / (2 * a), false)){
					std::cout << '+';
				}
				coe = wulishu(tem1 - tem2);
				tem4 = coe;
				coe = sqrt(coe);
				d = coe / (2 * a);
				if((tem1 - tem2) / tem4 == 0){
					std::cout << 0 << '\n';
					continue;
				}
				if(d == 1|| d == -1){
					std::cout << "sqrt(" << (tem1 - tem2) / tem4 << ")" << '\n';
				}
				else if(decision(d)){
					std::cout << abs(d) << "*sqrt(" << (tem1 - tem2) / tem4 << ")" << '\n';
				}
				else if(decision(1 / d)){
					std::cout << "sqrt(" << (tem1 - tem2) / tem4 << ")" << '/' << abs(1/d) << '\n';
				}
				else{
					for(int i = 2; i <= 50; i++){
						if(decision(i * d)){
							if(i * d == 1){
								std::cout << "sqrt(" << (tem1 - tem2) / tem4 << ")" << '/' << i << '\n';
							}
							std::cout << abs(i * d) << "*sqrt(" << (tem1 - tem2) / tem4 << ")" << '/' << i << '\n';
							break;
						}
					}
				}
			}
		}
	}
	return 0; 
}

回复

6 条回复,欢迎继续交流。

正在加载回复...