Вам нужно найти такие a и b, что a + b = x и ab = y. По теореме Виета a и b - корни уравнения . Находим дискриминант , если он отрицательный - у уравнения не то что натуральных, действительных решений нет. Если дискриминант неотрицательный, но не полный квадрат, то натуральных решений тоже нет. Иначе решения уравнения , если они натуральные - это и есть ответ.
У меня нет уверенности, что можно посчитать целый корень из большого натурального числа с стандартных функций, так что напишу свою реализацию на основе двоичного поиска.
#include <iostream>
#include <cmath>
long long isqrt(long long number) {
long long answer = 0, left = 0, right = 1e9;
while (left <= right) {
long long middle = (left + right) / 2;
long long middle_squared = middle * middle;
if (middle_squared == number) {
return middle;
} else if (middle_squared < number) {
answer = middle;
left = middle + 1;
} else {
right = middle - 1;
}
}
return answer;
}
int main() {
long long x, y;
std::cin >> x >> y;
auto d = x * x - 4 * y;
if (d < 0) {
std::cout << 0;
return 0;
}
auto sqrt_d = isqrt(d);
if (sqrt_d * sqrt_d != d) {
std::cout << 0;
return 0;
}
if ((x - sqrt_d) % 2 != 0) {
std::cout << 0;
return 0;
}
std::cout << (x - sqrt_d) / 2 << " " << (x + sqrt_d) / 2;
}
Поделитесь своими знаниями, ответьте на вопрос:
Олимпиада по 3d моделированию можете ли вы сделать 3d модель в autodesk
Так,сначала теория.
В формуле Герона (коя используется в этой программе) используется полупериметр!
Это означает, что надо ввести переменную полупериметра ( pp, к примеру). Тогда программа примет вид:
program P1;
var
a, b, c, p: integer;
pp, s: real;
begin
write('Введите сторону a = ');
readln(a);
write('Введите сторону b = ');
readln(b);
write('Введите сторону c = ');
readln(c);
p := a + b + c;
writeln('Периметр треугольника P = ', p);
pp := p / 2;
s := sqrt(pp * (pp - a) * (pp - b) * (pp - c));
writeln('Площадь треугольника S = ', s);
end.
Также замечу, что полупериметр и площадь относятся не к целочисленному типу данных.
И да, обращайте внимание на оформление.
Табуляции в программе, "сторона" вместо "координата", пробелы до и после равно, чтобы всё не выглядело слипшимся.