2

ユーザーが2つの数値(int)を入力する必要があり、異なる値ごとに1つの出力(intが望ましい!)が返されるような方法を見つける必要があります。ユーザーが入力したとすると、 (1つの入力のみが変更された場合でも)完全に異なる出力が生成されることを除いて、ユーザーがまたはまたは他の入力を入力したとき6, 8に返されます。しかし、それだけで一意である必要があるため、次のようなものを使用することはできませんが、出力も一意ではないため、入力ごとにまったく異なる出力が存在する方法を見つける必要があります。他の値については繰り返されません。k6,79,8m, n6, 8m, nm*n6 X 4 = 2412 X 2 = 24

編集:ニコラスへの応答:入力範囲は何でもかまいませんが、1000未満になります(もちろん1より大きくなります!)

編集2:Rawlingに応じて、long(Int64)を使用できますが、floatまたはdoulbeは使用しないことが望ましいです。この出力は、forループで使用され、floatとdoubleはforループでひどいため、ここで確認できます。

4

5 に答える 5

7

あなたの2つの数字は1000未満なので、あなたはk = (1000 * x1) + x2ユニークな答えを得るために行うことができます。最大値は999999、であり、これは32ビットの範囲内ですint

于 2012-05-29T08:01:32.143 に答える
6

あなたはいつでもlong2つの整数から:を返すことができますaそしてb2^|INT_SIZE|*a + b

鳩の巣原理から簡単にわかります。2つのintが与えられた場合、1つは異なる入力ごとに一意のintを返すことはできません。説明:それぞれがnビットを含む2つの数値がある場合、各数値には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件ないので、関数と呼ばれる関数があります。

Cantorの対関数(前のリンクに表示)やSzudzikの対関数などの対関数。これにより、入力を無限にしながら、一意で決定論的な出力を提供できます。

これがstackoverflowに関する別の同様の質問です。(素晴らしい、2つ以上のリンクを投稿するには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 に答える