场景:
要使一个整数变量始终保持在一个区间内,如:a 始终在 区间 [x,y]之间。若是 a 在操作中 出现溢出,
如上溢出 为 y+1 ,要使其变成 x, 下溢出 为 x-1, 要使其变成 y。
解法:
上溢出:
a(now) = ( a (befor) - x )% ( y - x + 1 )+ x ;
说说 ( a - x )的含义, 算出 与区间 最小值 的 差值 z( 区间 [x,a)数值的数量 ) , 取余 区间( [x,y] )数值 的数量 ( y - x + 1 ) 在加上 区间的最小值,即为 上溢出后数的所处的值。
例如 区间为 [ 27,48 ] ,a 分别为 28(未溢出代表) ,49(溢出代表)。
28 :( 28 - 27 ) % ( 48 - 27 + 1 ) + 27 = 28;
49 :( 49 - 27 ) % ( 48 - 27 + 1 ) + 27 = 27;
结果正确。
下溢出:
a(now) = y - ( ( y - a (befor) ) % ( y - x + 1) );
道理同上,此时计算 区间 的差值 需以 ( y(区间最大值) )来计算,在进行 对区间( [x,y] )数值 的数量 ( y - x + 1 )的取余。之后再用区间最大值对余数 进行减操作,可得到 下溢出后数的所处的值。
例如 区间为 [ 27,48 ] ,a 分别为 28(未溢出代表) ,26(溢出代表)。
48 : 48 - ( ( 48 - 28 )% ( 48 - 27 + 1 ))= 28;
26 : 48 - ( ( 48 - 26 )% ( 48 - 27 + 1 ))= 48;
结果正确。