我做某事有困难,我想将一个数字转换为给定范围内的“等价物”. 虽然这个概念很简单,但很难解释,所以我会尽我所能. 假设你有一排无限的瓷砖,但是虽然有无数的瓷砖,但它是重复的完
虽然这个概念很简单,但很难解释,所以我会尽我所能.
假设你有一排无限的瓷砖,但是虽然有无数的瓷砖,但它是重复的完全相同的颜色模式,如下所示:
正如你所看到的,我已经为每个图块添加了一个数字,但我们可以采用一个范围,从0到4,然后说:
0是紫色
1是蓝色
2是红色的
3是绿色的
4是黄色的
但是因为这种颜色模式无限重复,实际上,5将具有与0相同的颜色,6将具有与1相同的颜色,8将具有与3相同的颜色.
此外,我们不能忘记负数,例如,-1将具有与4相同的颜色.
实际上我想要做的是将任何给定的数字转换为我选择的范围的数量,这里的范围是[0; 4],这样我就知道什么颜色对应于这个特定的图块.
我也希望这种方法适用于其他范围,例如,如果我的范围是[1; 5]或甚至[-7; -3],它也应该有效.
我已经找到了一个适用于[0; n]范围(n为正整数)和另一个正整数的方法:
convertedNumber = a % (n+1)
以下是游乐场的内容:
但它的作用只是我描述的条件,经过几个小时的努力,我仍然找不到任何好的解决方案,使它适用于任何数字,正面或负面,以及任何范围.
不要犹豫,在评论中询问更多细节.
谢谢.
干得好.该函数采用您想要映射的数字,以及范围的低值和高值,并返回范围内的值:func mapNum(n: Int, low lo: Int, high hi: Int) -> Int { let spread = hi - lo + 1 return ((n - lo) % spread + spread) % spread + lo }
例子:
mapNum(-9, low: 0, high: 4) // returns "1" mapNum(-9, low: -3, high: 1) // returns "1" mapNum(1, low: -11, high: -7) // returns "-9" mapNum(3, low: -8, high: -4) // returns "-7" mapNum(-5, low: 4, high: 8) // returns "5" mapNum(-5, low: -6, high: -2) // returns "-5" mapNum(-9, low: -7, high: -3) // returns "-4"