я пытаюсь создать крошечное (или возможно не настолько крошечный) формула, которая будет содержать числа между минутой набора и макс., но также и циклично выполнять эти числа, таким образом, они не будут отсечены, если они за пределами диапазона. до сих пор это - то, что я имею.
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
я хотел бы не обратиться к использованию серии того, если/еще бы операторы, но можно было бы быть в порядке, если оно абсолютно требуется. это даже возможно?
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;
}
Математически вы должны уметь делать что-то вроде этого:
((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
Простите. Удалил предыдущий ответ. Попробуйте это:
((val-min)% (max-min) + max-min)% (max-min) + min
РЕДАКТИРОВАТЬ: если вы хотите, чтобы max было допустимым значением, а не переполнялось до min, замените max на max + 1 во всех 3 местах.