Подписываюсь под каждым словом объяснения @Nelle987.
Заданные значения x = a+b и y = ab - подходят под описание теоремы Виета. А значит, мы можем свести задачу к поиску корней квадратного уравнения в целых действительных числах.
Хочу дополнить ответ @Nelle987 другой реализацией целочисленного квадратного корня, работающего на этапе компиляции.
Код:
#include <iostream>constexpr long long isqrt (long long value, long long sq = 1ll, long long dlt = 3ll){ return sq <= value ? isqrt(value, sq+dlt, dlt+2ll) : (dlt >> 1) - 1ll;}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; return 0;}
C#:
int a;
ConsoleKeyInfo keyInfo;
do
{
Console.WriteLine("Введите номер одного из зимних месяцев:\n12, 1, 2");
a = Convert.ToInt32(Console.ReadLine());
switch (a)
{
case 12:
Console.WriteLine("Декабрь\n");
break;
case 1:
Console.WriteLine("Январь\n");
break;
case 2:
Console.WriteLine("февраль\n");
break;
default:
Console.WriteLine("Не зимний месяц\n");
break;
}
//Ниже идёт зацикливание программы, для удобства. Если Вам этого не требуется, то вместо нижеперечисленного впишите "Console.ReadKey();"
Console.WriteLine("Если хотите повторить программу нажмите F");
Console.WriteLine("Если хотите завершить программу нажмите любую другую кнопку\n");
keyInfo = Console.ReadKey(true);
}
while (keyInfo.Key == ConsoleKey.F);
[Del me plz]
Подписываюсь под каждым словом объяснения @Nelle987.
Заданные значения x = a+b и y = ab - подходят под описание теоремы Виета. А значит, мы можем свести задачу к поиску корней квадратного уравнения в целых действительных числах.
Хочу дополнить ответ @Nelle987 другой реализацией целочисленного квадратного корня, работающего на этапе компиляции.
Код:
#include <iostream>constexpr long long isqrt (long long value, long long sq = 1ll, long long dlt = 3ll){ return sq <= value ? isqrt(value, sq+dlt, dlt+2ll) : (dlt >> 1) - 1ll;}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; return 0;}