首页 > 解决方案 > 转换数字范围

问题描述

我需要将一个介于 0 和 65535 之间的数字转换为另一个介于 -800 和 240 之间的数字

所以如果 oldNumber = 0,那么 newNumber = -800

public static int ConvertA(int oldNumber)
{

}

newNumber = ConvertA(oldNumber);

反之亦然,所以如果它是 -800 到 240 则将其转换为 0 到 65535

public static int ConvertB(int oldNumber)
{

}
newNumber = ConvertB(oldNumber);

标签: c#mathnumbers

解决方案


你有两个整数区间A = [0, 65535]B = [-800, 240]并且你想要一个映射f: A -> B

你似乎已经说过你也想要约束:

  • f(0) == 240
  • f has a inverse transform g.

由于A(65536) 中的元素个数大于B(1041) 中的元素数,根据鸽子洞原理f,不可能injective(必须有x, yinA这样f(x) == f(y))。

结果,f不能进行逆变换g。这意味着约束无法得出解决方案。也就是说,您的问题没有解决方案

另外,请注意,您的变换不能是linear. 如果它是线性的,则需要满足f(a*x) == a*f(x)每个aand x,这不可能是真的,因为如果我们选择x == 0and a == 2,我们就有f(2*0) == f(0) == 240 == 2 * f(0) == 480,这显然是荒谬的。

线性要求f(0) == 0


但是,让我们变得灵活并改变你的约束......

因此,让我们假设我们不需要逆矩阵并且 f 不需要是线性的。也许是一个映射,例如

f(x) := max((-x) + 240, -800)满足您的需求。

在这种情况下:

  • f(0) == max(240, -800) == 240,满足第一个约束
  • 我们可以定义g: B -> Aas g(x) := (-x) + 240,它满足g(240) == 0并且是这样的,当约束到of时f(g(x)) == max((x - 240) + 240, -800) == max(x, -800) == x,含义f是相反的。gRangeg

最重要的是,以下解决方案可能是合适的:

  • f(x) := max((-x) + 240, -800)
  • g(x) := (-x) + 240

只是不要期望线性和/或逆变换。


使用这个假设,你有它:

public static int ConvertA(int oldNumber)
{
    if(oldNumber < 0 || oldNumber > 65535)
        throw new ArgumentOutOfRangeException();
    return Math.Max((-oldNumber) + 240, -800);
}
int newNumber = ConvertA(oldNumber);
public static int ConvertB(int oldNumber)
{
    if(oldNumber < -800 || oldNumber > 240)
        throw new ArgumentOutOfRangeException();
    return -oldNumber + 240;
}
int newNumber = ConvertB(oldNumber);

请记住,正如在乞讨中所讨论的那样,那ConvertB(ConvertA(65535))不是65535,因为ConvertB不是ConvertA


推荐阅读