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

标签 algorithm swift math logic

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

假设您有无限行瓷砖,但尽管有无限数量的瓷砖,但重复的是完全相同的颜色图案,如下所示: A row of coloured tiles, with the same color pattern repeating again and again. Each tile has a number.

如您所见,我为每个图 block 指定了一个数字,但我们可以取一个范围,从 0 到 4,然后说: 0是紫色
1 是蓝色
2 是红色的
3 是绿色
4 是黄色的

但是因为这种颜色模式无限重复,实际上,5 与 0 的颜色相同,6 与 1 的颜色相同,8 与 3 的颜色相同。
此外,我们不能忘记负​​数,例如 -1 与 4 具有相同的颜色。

实际上我想做的是将任何给定的数字转换成我选择的范围内的数字,这里是 [0;4] 范围,这样我就会知道什么颜色对应于这个特定的图 block 。
我还希望此方法适用于其他范围,例如,如果我的范围是 [1;5] 甚至 [-7;-3],它也应该适用。

我已经找到了适用于 [0;n] 范围(n 为正整数)和 a 的方法另一个正整数:

convertedNumber = a % (n+1)

这是它给 Playground 带来的好处: We are doing the conversion, which behaves as expected

但它只适用于我描述的条件,经过几个小时的努力,我仍然找不到任何好的解决方案来让它适用于任何数字,正数或负数,以及任何范围。

不要犹豫,在评论中询问更多详情。

谢谢。

最佳答案

给你。该函数采用您要映射的数字以及范围的低值和高值,并返回范围内的值:

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"

关于algorithm - 将数字转换为特定范围内的等效数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31233644/

相关文章:

iOS IDFA : Firebase and Google Adwords Universal App Campaign Setup

javascript - 如何使对象随拖动旋转,如何使用 sin 或 cos 获得围绕原点的旋转点?

ios - 代码签名错误: Code signing is required for product type 'Application' in SDK 'iOS 11.4'

c# - C# 是否支持任意精度算术?

mysql - 如何计算每个订单订购的平均服务以及用户的唯一引用? (MySQL)

java - 为什么 apache Mahout 频繁模式 minnig 算法只返回 1 项项集?

multithreading - 广播到多个线程的队列条目

java - 链表面试题

c - 如何查找大于/小于数组中元素的元素数?

ios - 实现 `backgroundColor` 的 `UIView` 的动画 `drawRect`