問題:
選択した言語で、符号なし64ビット整数の平方根の下限を返す最短関数を記述します。
テストケース:
関数はすべての入力に対して正しく動作する必要がありますが、アイデアを説明するのに役立ついくつかの例を次に示します。
INPUT ⟶ OUTPUT
0 ⟶ 0
1 ⟶ 1
2 ⟶ 1
3 ⟶ 1
4 ⟶ 2
8 ⟶ 2
9 ⟶ 3
15 ⟶ 3
16 ⟶ 4
65535 ⟶ 255
65536 ⟶ 256
18446744073709551615 ⟶ 4294967295
ルール:
- 関数には好きな名前を付けることができます。(名前のない関数、匿名関数、またはラムダ関数は、何らかの方法で呼び出し可能であれば問題ありません。)
- この課題では文字数が最も重要ですが、実行時間も重要です。非常に少ない文字数でO(√n)時間で答えを繰り返し上方にスキャンできると確信していますが、O(log(n))時間は本当に優れています(つまり、nの入力値を仮定すると、 n)のビット長ではありません。
- おそらく純粋に整数および/またはブール演算を使用して関数を実装することになるでしょう。ただし、浮動小数点計算を本当に使用する場合は、ライブラリ関数を呼び出さない限り問題ありません。したがって、
return (n>0)?(uint32_t)sqrtl(n):-1;正しい結果が得られたとしても、Cで言うだけでは立ち入り禁止です。あなたは浮動小数点演算を使用している場合は、使用することができ*、/、+、-、および累乗(例えば、**あるいは^それが選択した言語で作業を内蔵、しかしなら権力の唯一の累乗1以上)。この制限は、コールsqrt()またはバリアントを使用するか、値を½乗することにより、「不正」を防止することです。 - 浮動小数点演算を使用している場合(#3を参照)、戻り値の型が整数である必要はありません。戻り値が整数(floor(sqrt(n))など)であり、符号なし32ビット値を保持できることのみ。
- C / C ++を使用している場合、たとえば、
uint64_tおよびuint32_tで定義されているように、符号なしの64ビットおよび32ビット整数型が存在すると想定できますstdint.h。それ以外の場合は、整数型が64ビット符号なし整数を保持できることを確認してください。 - お使いの言語が64ビット整数をサポートしていない場合(たとえば、Brainfuckは8ビット整数しかサポートしていないようです)、それで最善を尽くし、回答タイトルに制限を明記してください。つまり、64ビット整数をエンコードし、8ビットのプリミティブ演算を使用してその平方根を正しく取得する方法を理解できれば、さらに強力になります。
- 楽しんで創造的になってください!
O(log_2 n) === O(log_4 n)。log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2