Математическое цикличное выполнение между Min и Max Используя модификацию?

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

min1 = 10
max1 = 90

val1 = 92
//will make 11, which is what i want since it loops

formula:  min(max(min1,min(val1,max1)),mod(val1,max1)+min1)

однако, я хотел бы, чтобы это циклично выполнило другое направление также, так, чтобы, если val1 равняется 5, который является-5 за пределами min1, это стало 86.

другая проблема, с которой я сталкиваюсь, является этим

max1 % max1 != max1

поскольку я хочу это к, так как макс. является часть диапазона

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

min1 = 10
max1 = 90
----------------------------------------------
val1 = 30    //within range: stays as 30 
val1 = 90    //within range: stays as 90
val1 = -6    //below range: loops to becomes 75
val1 = 98    //above range: loops to becomes 17
val1 = 91    //above range: loops to becomes 10

я хотел бы не обратиться к использованию серии того, если/еще бы операторы, но можно было бы быть в порядке, если оно абсолютно требуется. это даже возможно?

8
задан TheDarkIn1978 16 June 2010 в 23:47
поделиться

3 ответа

int loop(int val, int min, int max)
{
    int p = max-min+1;
    int mod = (val-min)%p;
    if(mod<0)
        mod += p;
    return min+mod;
}
3
ответ дан 5 December 2019 в 22:16
поделиться

Математически вы должны уметь делать что-то вроде этого:

((val-min) `mod` (max-min+1)) + min

Переместите свой диапазон вниз, чтобы отсчитывать его от нуля, отсеките верхний предел и сдвиньте его назад в правильный диапазон. К сожалению, оператор% в C дает отрицательные результаты для отрицательных чисел. Итак:

3 % 10 => 3
13 % 10 => 3
-3 % 10 => -3
-13 % 10 => -3

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

((val-min)%(max-min+1) + (max-min+1)) % (max-min+1) + min
2
ответ дан 5 December 2019 в 22:16
поделиться

Простите. Удалил предыдущий ответ. Попробуйте это:

((val-min)% (max-min) + max-min)% (max-min) + min

РЕДАКТИРОВАТЬ: если вы хотите, чтобы max было допустимым значением, а не переполнялось до min, замените max на max + 1 во всех 3 местах.

1
ответ дан 5 December 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: