非常に大きな仮想グリッド内で関心のある特定の座標を見つけようとしています。寸法が大きいため、このグリッドは実際にはメモリに存在しません。この質問のために、それらの次元をであると仮定しましょう(Width x Height) = (Int32.MaxValue x Int32.MaxValue)
。
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
グリッドに関する既知のデータ:
- グリッドの寸法=
(Int32.MaxValue x Int32.MaxValue)
。 - 任意
(x, y)
の座標での値=XとYの積=(x * y)
。
(x * y)
上記の有限数の大きなセットを考えると、値がの累乗である座標のセットを計算する必要がありますe
。e
この場合は2だとしましょう。
グリッドをループすることはオプションではないので、私はループすることを考えました:
int n = 0;
long r = 0;
List<long> powers = new List<long>();
while (r < (Int32.MaxValue * Int32.MaxValue))
{
r = Math.Pow(e, n++);
powers.Add(r);
}
これは私たちにユニークな力のセットを与えます。ここで、各パワーがどの座標に存在するかを調べる必要があります。取りましょう2^3=8
。上のグリッドに示されているように、8つは4つの座標に存在します(8,1), (4,2), (2,4) & (1, 8)
。
明らかに、ここでの問題は、数値8の複数の因子を見つけることですが、これは、数値が大きい場合には実用的ではなくなります。これを達成する別の方法はありますか?私は何かを逃していますか?
- 因子がメモリに存在しないため、セットの使用は機能しません。
- 問題の数が常にの累乗になることを知って因数分解する創造的な方法はあり
e
ますか?