根据两个输入找到一个独特的输出?

时间:2012-05-29 07:56:20

标签: c# algorithm math unique

我需要找到一种方法,这样用户必须输入2个数字(int),并且对于每个不同的值,返回单个输出(最好是int)。 假设用户输入6, 8,当用户输入k6,7之类的任何内容或除9,8以外的任何其他输入m, n时,它会返回6, 8如果只改变了一个输入,则产生完全不同的输出。但事实是,它应该是唯一的m, n所以我不能使用像m*n这样的东西因为6 X 4 = 24而且12 X 2 = 24所以输出不是唯一的,所以我需要找到一种方法,对于每个不同的输入,有一个完全不同的输出,不会重复任何其他值。

编辑:回应Nicolas:输入范围可以是小于1000(但当然超过1)!

EDIT 2 :为了回应Rawling,我可以使用long(Int64),但最好不要使用float或doulbe,因为这个输出将用于for循环,而float和double都很糟糕for for循环,你可以检查它here

5 个答案:

答案 0 :(得分:7)

由于您的两个数字小于1000,您可以k = (1000 * x1) + x2获得唯一答案。最大值为999999,完全在32位int的范围内。

答案 1 :(得分:6)

您始终可以从两个整数longa返回b:,返回2^|INT_SIZE|*a + b

pigeonhole principle很容易看出,给定两个整数,不能为每个不同的输入返回唯一的int。说明:如果你有2个数字,每个数字包含n位,那么每个数字都有2^n种可能性,因此有(2^n)^2个可能的对,所以从馅饼原理 - 你需要在至少lg_2((2^n)^2) = 2n位代表它们,

编辑:您的编辑提到您的号码范围为[1,1000] - 因此可以应用相同的构思:1000*a + b将为每对产生唯一的int。
请注意,出于同样的原因,结果整数的范围必须为[1,1000000] - 否则会发生冲突。

答案 2 :(得分:1)

因为我没有50个帖子可以评论,我必须说,有功能 叫Pairing Functions

配对功能,例如Cantor的配对功能(显示在上一个链接上)和Szudzik's Pairing Function,它允许输入无限,并且仍然能够提供唯一且确定的输出。

这是关于stackoverflow的另一个类似问题。 (很好,我需要10个声望才能发布超过两个链接..)

(http://)stackoverflow.com/questions/919612/mapping-two-integers-to-one-in-a-unique-and-deminministic-way

编辑:我迟到了。

答案 3 :(得分:0)

如果您没有硬上限,则可以执行以下操作:

int Unique (int x, int y)
{
    int n = x + y;
    int t = (n%2==0) ? ((n/2) * (n+1)) : (n * ((n+1)/2));
    return t + x;
}

从数学上讲,这将为每个(非负)整数对返回一个唯一的非负整数,没有上限。

以编程方式说,它会遇到溢出问题,除了输入变量之外的所有内容都可以使用long代替int来解决。

答案 4 :(得分:0)

规范的数学解决方案是使用主要权力。由于每个数字都可以唯一地分解为其素数因子,因此返回2^n * 3^m将为每个n和m提供不同的结果。

这可以扩展到2^n * 3^m * 5^a * 7^b *11^c等等;你只需要检查你没有用完32位整数。如果存在溢出的风险,您可以在除以大于输入范围的素数后取余数,并且您仍然具有唯一性。