我需要找到一种方法,这样用户必须输入2个数字(int),并且对于每个不同的值,返回单个输出(最好是int)。
假设用户输入6, 8
,当用户输入k
或6,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
答案 0 :(得分:7)
由于您的两个数字小于1000,您可以k = (1000 * x1) + x2
获得唯一答案。最大值为999999
,完全在32位int
的范围内。
答案 1 :(得分:6)
您始终可以从两个整数long
和a
返回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位整数。如果存在溢出的风险,您可以在除以大于输入范围的素数后取余数,并且您仍然具有唯一性。