Masalah:
Dalam pilihan bahasa Anda, tulis fungsi terpendek yang mengembalikan lantai akar kuadrat dari integer 64-bit yang tidak ditandatangani.
Kasus uji:
Fungsi Anda harus bekerja dengan benar untuk semua input, tetapi di sini ada beberapa yang membantu mengilustrasikan ide tersebut:
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
Aturan:
- Anda dapat memberi nama fungsi apa pun yang Anda suka. (Fungsi yang tidak disebutkan namanya, anonim, atau lambda baik-baik saja, asalkan fungsi tersebut dapat dipanggil.)
- Hitungan karakter adalah yang terpenting dalam tantangan ini, tetapi runtime juga penting. Saya yakin Anda dapat memindai ke atas secara iteratif untuk jawaban dalam waktu O (√n) dengan jumlah karakter yang sangat kecil, tetapi waktu O (log (n)) akan benar-benar lebih baik (yaitu, dengan asumsi nilai input n, tidak sedikit-panjang n).
- Anda mungkin ingin mengimplementasikan fungsi menggunakan integer murni dan / atau artitmetika boolean. Namun, jika Anda benar-benar ingin menggunakan perhitungan floating-point, maka itu tidak masalah selama Anda memanggil fungsi pustaka. Jadi, hanya mengatakan
return (n>0)?(uint32_t)sqrtl(n):-1;
dalam C adalah terlarang meskipun itu akan menghasilkan hasil yang benar. Jika Anda menggunakan aritmatika floating-point, Anda dapat menggunakan*
,/
,+
,-
, dan eksponensial (misalnya,**
atau^
jika itu built-in operator dalam bahasa pilihan Anda, tetapi eksponensial hanya kekuasaan tidak kurang dari 1 ). Pembatasan ini untuk mencegah "kecurangan" dengan memanggilsqrt()
atau varian atau meningkatkan nilai ke kekuatan ½. - Jika Anda menggunakan operasi floating-point (lihat # 3), Anda tidak diharuskan untuk mengembalikan tipe integer; hanya bahwa nilai kembali adalah bilangan bulat, mis. lantai (sqrt (n)), dan dapat menampung nilai 32-bit yang tidak ditandatangani.
- Jika Anda menggunakan C / C ++, Anda dapat mengasumsikan keberadaan tipe integer 64-bit dan 32-bit yang tidak ditandatangani, misalnya,
uint64_t
danuint32_t
seperti yang didefinisikan dalamstdint.h
. Jika tidak, pastikan saja tipe integer Anda mampu menahan integer 64-bit yang tidak ditandatangani. - Jika bahasa Anda tidak mendukung bilangan bulat 64-bit (misalnya, Brainfuck tampaknya hanya memiliki dukungan bilangan bulat 8-bit), maka lakukan yang terbaik dengan itu dan nyatakan batasan dalam judul jawaban Anda. Yang mengatakan, jika Anda dapat mengetahui cara mengkodekan integer 64-bit dan mendapatkan akar kuadrat dengan benar menggunakan aritmatika primitif 8-bit, maka lebih banyak kekuatan untuk Anda!
- Bersenang-senang dan menjadi kreatif!
O(log_2 n) === O(log_4 n)
. log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2