微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

algorithm – 将数字转换为特定范围内的等效数字

我做某事有困难,我想将一个数字转换为给定范围内的“等价物”.
虽然这个概念很简单,但很难解释,所以我会尽我所能.

假设你有一排无限的瓷砖,但是虽然有无数的瓷砖,但它是重复的完全相同的颜色模式,如下所示:
  

正如你所看到的,我已经为每个图块添加一个数字,但我们可以采用一个范围,从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"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐