2

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

编辑:响应尼古拉斯:输入范围可以是任何东西,但会小于 1000(但当然大于 1!)

编辑 2:作为对 Rawling 的回应,我可以使用 long (Int64) 但最好不要使用 float 或 doulbe,因为此输出将用于 for 循环,而 float 和 double 对于 for 循环来说很糟糕,你可以在这里查看

4

5 回答 5

7

由于您的两个数字小于 1000,因此您可以k = (1000 * x1) + x2得到一个唯一的答案。最大值将是999999,它在 32 位的范围内int

于 2012-05-29T08:01:32.143 回答
6

你总是可以long从两个整数中返回一个 : ab返回2^|INT_SIZE|*a + b

从鸽巢原理很容易看出,给定两个 int,一个不能为每个不同的输入返回唯一的 int。解释:如果你有 2 个数字,每个数字都包含n位,那么2^n每个数字都有可能,因此有(2^n)^2可能的对,所以根据鸽洞原理 - 你至少需要lg_2((2^n)^2) = 2n 位来表示它们,

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

于 2012-05-29T08:00:47.513 回答
1

因为我没有 50 个帖子要评论,所以我必须说,有一些函数叫做Pairing Functions

配对函数,例如 Cantor 的配对函数(如上一个链接所示)和Szudzik 的配对函数,它允许输入是无限的,并且仍然能够提供唯一且确定性的输出。

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

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

编辑:我迟到了。

于 2015-12-31T16:48:43.967 回答
0

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

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

于 2012-05-29T08:34:49.093 回答
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输入变量以外的所有内容来克服。

于 2012-05-29T08:10:07.050 回答