Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据两个输入查找唯一的输出?_C#_Algorithm_Math_Unique - Fatal编程技术网

C# 根据两个输入查找唯一的输出?

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

我需要找到一种方法,这样用户必须输入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:输入范围可以是任何东西,但不能小于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的配对函数本身。然后,作为一个最低限度的回答,它基本上不会被标记。然而,试着回答一些问题,这些问题不是重复的,并且是明确的和可回答的。另外,请阅读本页。