Russian Qt Forum
Ноябрь 22, 2024, 19:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Функция нормирования значение  (Прочитано 8577 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« : Март 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 не дают остатка.

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 15, 2016, 16:57 »

if L % V then X = V + (L - int(L/V)*V)
else X = L / V
Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Fat-Zer
Гость
« Ответ #2 : Март 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
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Март 15, 2016, 17:46 »

да, точно. значит Х = V ± (L - int(L/V)*V) и смотреть на кого из них поделится без остатка
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Fat-Zer
Гость
« Ответ #4 : Март 15, 2016, 18:36 »

да, точно. значит Х = V ± (L - int(L/V)*V) и смотреть на кого из них поделится без остатка
L=11; V=5;

целочисленная арифметика не так проста... думаю, что сложность в общем случае тут не меньше, чем O(sqrt(L)).
« Последнее редактирование: Март 15, 2016, 18:44 от Fat-Zer » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Март 15, 2016, 18:49 »

Свой алгоритм - тупо подбор в обе стороны по очереди.
Заодно проверяет макс и мин границы допустимого значения.
Я не математик, так что могу только так Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Март 15, 2016, 19:42 »

да, точно. значит Х = V ± (L - int(L/V)*V) и смотреть на кого из них поделится без остатка
L=11; V=5;
это уже простые числа пошли Улыбающийся ТСу виднее могут ли такие быть
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Май 24, 2017, 15:03 »

Можно перебирать в обе стороны, а можно разложить V на простые числа и перебрать все варианты с простыми числами(например для 5ти простых чисел, берем первое число, берем второе число, 1е и 2е, 3е... 1е 2е 3е 4е 5е.

при переборе хранить минимальную разницу и набор. Хотя данный способ будет возможно медленнее.
« Последнее редактирование: Май 24, 2017, 15:05 от deMax » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.12 секунд. Запросов: 23.