先看50分的代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a,b,c,d,aa,ba,nb,x = 1;
int gcd(int x,int y){
return x % y == 0 ? y : gcd(y,x % y);
}
void change(int &a,int &b){
int g = gcd(a,b);
a /= g,b /= g;
}
bool is_sq(){
int r = sqrt(d);
if(r * r == d){
d = r;
return 1;
}
return 0;
}
void fen(){
for(int i = 2;i * i <= d;i++){
if(d % (i * i) == 0){
x *= i;
d /= i * i;
}
}
}
bool check(){
return (d > 0 && ba > 0) || (d < 0 || ba < 0);
}
void can_out(){
if(nb == 0);
else if(aa == 1) printf("%d",nb);
else{
if((nb > 0 && aa > 0) || nb < 0 && aa < 0)
printf("%d/%d",abs(nb),abs(aa));
else
printf("-%d/%d",abs(nb),abs(aa));
}
if(nb != 0 && d != 0 && check()) printf("+");
else if(nb != 0 && d != 0) printf("-");
}
void cant_out(){
if(nb == 0);
else if(aa == 1) printf("%d",nb);
else{
if((nb > 0 && aa > 0) || nb < 0 && aa < 0)
printf("%d/%d",abs(nb),abs(aa));
else{
printf("-%d/%d",abs(nb),abs(aa));
}
}
if(nb != 0 && d != 0 && check()) printf("+");
else if(nb != 0 && d != 0) printf("-");
}
void cant_sq(){
aa = 2 * a,ba = 2 * a,nb = -b;
change(nb,aa);
fen();
change(x,ba);
cant_out();
}
void can_sq(){
aa = 2 * a,ba = 2 * a,nb = -b;
if((nb + d) % aa == 0){
cout << (nb + d) / aa << endl;
return ;
}
change(d,ba);
change(nb,aa);
can_out();
}
void solve(){
x = 1;
cin >> a >> b >> c;
d = b * b - 4 * a * c;
if(d < 0){
cout << "NO\n";
return ;
}
else if(is_sq()){
can_sq();
}
else{
cant_sq();
}
}
int main(){
freopen("uqe.in","r",stdin);
freopen("uqe.out","w",stdout);
int t,m;
cin >> t >> m;
while(t--){
solve();
}
fclose(stdin);
fclose(stdout);
return 0;
}
再看100分的代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a,b,c,d,aa,ba,nb,x = 1;
int gcd(int x,int y){
return x % y == 0 ? y : gcd(y,x % y);
}
void change(int &a,int &b){
if(b < 0) b = -b,a = -a;
int g = gcd(abs(a),abs(b));
a /= g,b /= g;
if(b < 0) b = -b,a = -a;
}
bool is_sq(){
int r = sqrt(d);
if(r * r == d){
d = r;
return 1;
}
return 0;
}
void fen(){
if(d == 1) return ;
for(int i = 2;i * i <= d;i++){
while(d % (i * i) == 0){
x *= i;
d /= (i * i);
}
}
}
void can_out(){
int x1 = nb + d,x2 = nb - d,x3;
if(aa > 0) x3 = x1;
else x3 = x2;
change(x3,aa);
if(x3 == 0) cout << "0\n";
else if(aa == 1) cout << x3 << endl;
else printf("%d/%d\n",x3,aa);
// if(nb == 0);
// else if(aa == 1) printf("%d",nb);
// else{
// if((nb > 0 && aa > 0) || (nb < 0 && aa < 0))
// printf("%d/%d",abs(nb),abs(aa));
// else
// printf("-%d/%d",abs(nb),abs(aa));
// }
// if(nb != 0 && d != 0) printf("+");
// //else if(nb != 0 && d != 0) printf("-");
//
// if(d == 0);
// else if(ba == 1) printf("%d",abs(d));
// else printf("%d/%d",abs(d),abs(ba));
// printf("\n");
}
void cant_out(){
change(nb,aa);
fen();
change(x,ba);
if(nb == 0);
else if(aa == 1) printf("%d",nb);
else{
if((nb > 0 && aa > 0) || (nb < 0 && aa < 0))
printf("%d/%d",abs(nb),abs(aa));
else{
printf("-%d/%d",abs(nb),abs(aa));
}
}
if((nb != 0) && (d != 0)) printf("+");
//else if(nb != 0 && d != 0) printf("-");
}
void cant_sq(){
aa = 2 * a,ba = 2 * a,nb = -b;
cant_out();
}
void can_sq(){
aa = 2 * a,ba = 2 * a,nb = -b;
can_out();
}
void solve(){
x = 1;
cin >> a >> b >> c;
d = b * b - 4 * a * c;
if(d < 0){
cout << "NO\n";
return ;
}
else if(is_sq()){
can_sq();
}
else{
cant_sq();
}
}
int main(){
freopen("uqe.in","r",stdin);
freopen("uqe.out","w",stdout);
int t,m;
cin >> t >> m;
while(t--){
solve();
}
fclose(stdin);
fclose(stdout);
return 0;
}
你猜哪错了?
if(x == 1) 改为 if(abs(x) == 1)