Проверьте, содержит ли переменная определенные числа - PullRequest
0 голосов
/ 06 июля 2019

Я создал программу для решения формулы {f (y) = area / y}, которая вычисляет высоту и ширину [X и Y] прямоугольника, чтобы он имел определенную площадь, и в то же время,высота и ширина имеют определенное соотношение между ними {1.0539435519260202716443150560307}.

программа применяет диапазон чисел [Xmin, Xmax] к формуле для Y и выводит Y, X и соотношение X / Y водна строка, и цикл увеличивает число, которое будет применяться «шагом» каждый раз, когда цикл заканчивается.

, поэтому проблема заключается в том, чтобы найти наиболее точное соотношение (ближайшее к тому, которое янужно), мне нужно сделать шаг слишком маленьким, но это дает мне тысячи результатов, которые я не могу найти вручную, поэтому я хотел, чтобы программа печатала только те строки, которые имеют отношение, по крайней мере, включающеечисла {1,053}, так что я уверен, что это слишком близко к исходному отношению, которое я хочу, я попытался найти много, но, кажется, все доступные методы длятолько звонит, так что кто-то может предложить мне обходной путь / логику или даже совершенно другой способ сделать это?Кроме того, я пробовал язык vb.net, но он тот же, он применяется только к строкам.

Вот код: -

(Объявление переменной не было выделено в stackoverflow, поэтомуя удалил его, но я установил «двойной» тип данных для четырех переменных).

cout << "Enter Area" << endl;
cin >> area;
cout << "Enter Xmin" << endl;
cin >> Xmin;
cout << "Enter Xmax" << endl;
cin >> Xmax;
cout << "Enter Step" << endl;
cin >> step;

double x, y, multi, ratio;

for (double i = Xmin; i <= Xmax; i += step)
{
    x = i;
    y = area / x;
    multi = x * y;
    ratio = x / y;

    cout << "y = " << y << "     X = " << x << "     Ratio  =  " << ratio << endl;

}
system("pause");

И нет никакого способа для этого, есть ли другой язык программирования, который поддерживает эту простую задачу?

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

Это можно сделать с помощью некоторой простой алгебры:

У нас есть x * y = area и x / y = ratio.Существует несколько способов решения этой системы уравнений, например, умножение двух уравнений, которые дают вам x^2 = area * ratio.Так что x = sqrt(area * ratio).Разделив два уравнения, получим y^2 = area / ratio, поэтому y = sqrt(area / ratio).

0 голосов
/ 06 июля 2019

Попробуйте:

const double requestedRatio = 1.0539435519260202716443150560307;

while(Xmax - Xmin >= 0.00000000001)
{
    x = (Xmax + Xmin) * 0.5;
    y = area / x;
    multi = x * y;
    ratio = x / y;

    if (ratio < requestedRatio) Xmin = x;
    else Xmax = x;
}    
cout << "y = " << y << "     X = " << x << "     Ratio  =  " << ratio << endl;

Это классический бинарный поиск.Вы начинаете с диапазона поиска Xmin:Xmax.Разделите его пополам и выберите ту часть, которая «ближе» к вашему ожидаемому результату, чем другая.В результате вы можете найти x как можно ближе к требуемому соотношению - просто измените условие while.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...