Нормализация коэффициентов уравнения ax + by + c = 0
a*x + b*y = c
g = gcd([a, b, c])
(a/g)*x + (b/g)*y = (c/g)
if a != 0: a > 0
elif b != 0: b > 0
else: c > 0
#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : abs(a);
}
int gcd3(int a, int b, int c) {
return gcd(gcd(a, b), c);
}
int main() {
int a, b, c;
cin >> a >> b >> c;
int g = gcd3(a, b, c);
a /= g; b /= g; c /= g;
if (a < 0 || (a == 0 && b < 0) || (a == 0 && b == 0 && c < 0)) {
a = -a; b = -b; c = -c;
}
cout << a << " " << b << " " << c << endl;
return 0;
}
Уравнение прямой ax + by = c приводится к нормальному виду:
Такая нормализация позволяет однозначно сравнивать прямые и упрощает их хранение.
Ввод: a b c — коэффициенты уравнения ax + by = c
Вывод: нормализованные коэффициенты
-2 4 6
НОД(2,4,6) = 2 → (-1, 2, 3) → a < 0, умножаем на -1 → (1, -2, -3)
Вывод: 1 -2 -3