C# 根据两个输入查找唯一的输出?
我需要找到一种方法,这样用户必须输入2个数字(int),对于每个不同的值,都会返回一个输出(最好是int!)。 假设用户输入C# 根据两个输入查找唯一的输出?,c#,algorithm,math,unique,C#,Algorithm,Math,Unique,我需要找到一种方法,这样用户必须输入2个数字(int),对于每个不同的值,都会返回一个输出(最好是int!)。 假设用户输入6,8,当用户输入任何其他内容,如6,7或9,8或任何其他输入m,n时,返回k(即使只更改了一个输入),则会产生完全不同的输出。但问题是,它应该只对m,n是唯一的,所以我不能使用m*n这样的东西,因为6 X 4=24而且,12 X 2=24所以输出不是唯一的,所以我需要找到一种方法,对于每个不同的输入,有一个完全不同的输出,对于任何其他值都不会重复 编辑:回应Nicolas
6,8
,当用户输入任何其他内容,如6,7
或9,8
或任何其他输入m,n
时,返回k
(即使只更改了一个输入),则会产生完全不同的输出。但问题是,它应该只对m,n
是唯一的,所以我不能使用m*n
这样的东西,因为6 X 4=24
而且,12 X 2=24
所以输出不是唯一的,所以我需要找到一种方法,对于每个不同的输入,有一个完全不同的输出,对于任何其他值都不会重复
编辑:回应Nicolas:输入范围可以是任何东西,但不能小于1000(当然,也可以大于1!)
编辑2:作为对Rawling的响应,我可以使用long(Int64),但最好不要使用float或doulbe,因为此输出将用于for循环,而float和double对于for循环很糟糕,您可以检查它您可以始终从两个整数
a
和b
返回一个长的,返回2^| INT|u SIZE |*a+b
从中很容易看出,给定两个int,不能为每个不同的输入返回唯一的int。说明:如果你有两个数字,每个数字都包含n
位,那么每个数字都有2^n
的可能,因此有(2^n)^2
的可能对,因此根据piegeonhole原理,你至少需要lg_2((2^n)^2)=2n
位来表示它们
编辑:您的编辑提到您的数字范围是[11000]
-因此可以应用相同的想法:1000*a+b
将为每对数字生成一个唯一的整数。
请注意,出于同样的原因,结果整数的范围必须是[11000000]
,否则会发生冲突。由于两个数字小于1000,您可以执行k=(1000*x1)+x2来获得唯一的答案。最大值应为999999
,这在32位int
的范围内。如果没有硬上限,可以执行以下操作:
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
来克服。标准的数学解决方案是使用素数幂。由于每个数字都可以唯一地分解为其素因子,因此返回2^n*3^m
将为每个n和m提供不同的结果
这可以扩展到2^n*3^m*5^a*7^b*11^c
等;只需检查32位整数是否用完。如果有溢出的风险,可以在除以比输入范围大的素数后取余数,并且仍然具有唯一性 因为我没有50篇帖子可以发表评论,我必须说,有很多功能
打电话来
配对功能,如Cantor的配对功能(如前一链接所示),允许输入无限,并且仍然能够提供唯一和确定的输出
下面是关于stackoverflow的另一个类似问题。(太好了,我需要10个声誉来发布两个以上的链接。)
(http://)stackoverflow.com/questions/919612/mapping-two-integers-to-one-in-a-unique-and-deterministic-way
编辑:我迟到了。如果每个输入都小于1000,只需存储m*1000+n。我会说Cantor的配对函数更接近于这个问题的标准解(因为它是将所有整数对集映射到整数集的相关问题的标准解),而且需要较少的计算。公平点;我想这取决于你是来自数论还是集合论:)首先,感谢你指出了重复的目标;我投票决定以重复的方式结束这个问题。为了提高这个答案的质量,您需要在问题中包含链接文章的相关部分,例如Cantor的配对函数本身。然后,作为一个最低限度的回答,它基本上不会被标记。然而,试着回答一些问题,这些问题不是重复的,并且是明确的和可回答的。另外,请阅读本页。