Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Racheengel от Март 15, 2016, 15:59



Название: Функция нормирования значение
Отправлено: Racheengel от Март 15, 2016, 15:59
Всем Привет,

может быть я туплю и не вижу очевидного... но нужна функция, которая бы нормировала заданное значение относительно какого-либо диапазона так, чтобы длина диапазона, поделенная на нормированное значение, была целым числом.

Например: диапазон имеет размер L = 864 единицы, базовое значение задано V = 20.
Найти максимально близкое к 20 значение X, чтобы 864 делилось на него без остатка.
Т.е. (L % X == 0) && (abs(X - V) -> 0)

В примере X будет удовлетворять значение 16 или 24, т.к. 864 / 24 и 864 / 16 не дают остатка.

Ручками то я накидал алгоритм. Но может быть есть что стандартное?


Название: Re: Функция нормирования значение
Отправлено: kambala от Март 15, 2016, 16:57
if L % V then X = V + (L - int(L/V)*V)
else X = L / V
:)


Название: Re: Функция нормирования значение
Отправлено: Fat-Zer от Март 15, 2016, 17:12
в stl'е такого точно нет...

а свой алгоритм, ради интереса, какой? перебор? разложение на множители и потом какой-то хитрый перебор по ним?

if L % V then X = V + (L - int(L/V)*V)
else X = L / V
L=10; V=3  уже не то...
и второе должно быть X=V


Название: Re: Функция нормирования значение
Отправлено: kambala от Март 15, 2016, 17:46
да, точно. значит Х = V ± (L - int(L/V)*V) и смотреть на кого из них поделится без остатка


Название: Re: Функция нормирования значение
Отправлено: Fat-Zer от Март 15, 2016, 18:36
да, точно. значит Х = V ± (L - int(L/V)*V) и смотреть на кого из них поделится без остатка
L=11; V=5;

целочисленная арифметика не так проста... думаю, что сложность в общем случае тут не меньше, чем O(sqrt(L)).


Название: Re: Функция нормирования значение
Отправлено: Racheengel от Март 15, 2016, 18:49
Свой алгоритм - тупо подбор в обе стороны по очереди.
Заодно проверяет макс и мин границы допустимого значения.
Я не математик, так что могу только так :)


Название: Re: Функция нормирования значение
Отправлено: kambala от Март 15, 2016, 19:42
да, точно. значит Х = V ± (L - int(L/V)*V) и смотреть на кого из них поделится без остатка
L=11; V=5;
это уже простые числа пошли :) ТСу виднее могут ли такие быть


Название: Re: Функция нормирования значение
Отправлено: deMax от Май 24, 2017, 15:03
Можно перебирать в обе стороны, а можно разложить V на простые числа и перебрать все варианты с простыми числами(например для 5ти простых чисел, берем первое число, берем второе число, 1е и 2е, 3е... 1е 2е 3е 4е 5е.

при переборе хранить минимальную разницу и набор. Хотя данный способ будет возможно медленнее.