C#

Найти два неотрицательных вещественных числа a и b, такие что a+b=d и a⋅b=d.

Дано: положительное число d
Путём двоичного поиска, требуется найти такие два числа a и b, что

a+b = d
a*b = d

Требуется вывести на экран числа a и b, если таких чисел нет, выводится слово "NO"

Мой код выглядит следующим образом:


 using System; 

namespace ConsoleApp
{
public class Program
{
static void Main(string[] args)
{
int d = Convert.ToInt16(Console.ReadLine());

double aMin = 0.0000000001;
double aMax = d + 100;

while (aMin
 a+b = d 
a*b = d
b = d - a

a * (d - a) = d
a² - a * d + d = 0

D = d² - 4 * d = d * (d - 4)
a = (d - √D) / 2
b = (d + √D) / 2
Но если нужен именно двоичный поиск, то:
 int d = Convert.ToInt32(Console.ReadLine());
if (d < 4) {
Console.WriteLine("NO");
return;
}

double left = 1.0, right = 2.0;
while (right - left >= 0.0000001) {
double middle = (left + right) / 2.0;
if (middle * (d - middle) < d) {
left = middle;
} else {
right = middle;
}
}

double a = (left + right) / 2.0;
double b = d / a;
Console.WriteLine($"{a:F9} {b:F9}");
Меньшее значение ВСЕГДА лежит в диапазоне [1;2], большее - в диапазоне [2;+∞).
Потому, проще искать бисекцией одно меньшее значение.

Это когда ты дискретный индекс ищешь, надо Left + 1 и Right - 1. А когда вещественный корень уравнения, никаких - 0.0000000001 и + 0.0000000001 быть не должно. И Math.Round тоже быть не должно.

Выход из двоичного поиска не когда разница значения функции и требуемого значения меньше эпсилон, а когда ширина отрезка, в котором ищем значение, меньше эпсилон.
РT
Рахмонали Tj_R@x Абдушукуров
53 918
Лучший ответ
Интересная магия у них
1.002247202+445.997752798=447
1.002247202*445.997752798=446,99999984
Гэсэр Раднаев
Гэсэр Раднаев
7 589