Sorun:
Dil seçiminize, işaretsiz bir 64 bit tamsayının kare kökünün tabanını döndüren en kısa işlevi yazın.
Test senaryoları:
İşlevinizin tüm girdiler için doğru şekilde çalışması gerekir, ancak fikri açıklamaya yardımcı olan birkaç şey aşağıdadır:
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
Kurallar:
- İşlevinize istediğiniz herhangi bir ad verebilirsiniz. (Adsız, anonim veya lambda işlevleri, bir şekilde çağrılabildikleri sürece iyidir.)
- Karakter sayımı bu zorlukta en önemli olan şeydir, ancak çalışma zamanı da önemlidir. Eminim çok küçük bir karakter sayısı ile O ()n) zamanında cevap için yinelemeli olarak yukarı doğru tarayabilirsiniz, ancak O (log (n)) süresi gerçekten daha iyi olurdu (yani, n giriş değeri varsayarak, bit uzunluğu n değil).
- Büyük olasılıkla işlevi tamamen tamsayı ve / veya boole artitmetiği kullanarak uygulamak isteyeceksiniz. Ancak, gerçekten kayan nokta hesaplamaları kullanmak istiyorsanız, hiçbir kütüphane işlevi çağırmadıkça bu iyi olur. Bu nedenle,
return (n>0)?(uint32_t)sqrtl(n):-1;doğru sonucu üretse bile , sadece C'de söylemek sınırların dışındadır. Eğer kayan noktalı aritmetik kullanıyorsanız, bunu yapmak için ise*,/,+,-, ve üs (örn**veya^bir seçtiğiniz dilde operatör dahili fakat eğer güçlerin sadece üs alma az olmamak 1'den ). Bu kısıtlama çağıraraksqrt()veya bir varyant vererek veya ½ gücüne bir değer yükselterek "aldatmayı" önlemektir . - Kayan nokta işlemleri kullanıyorsanız (bkz. # 3), dönüş türünün tamsayı olması gerekmez; yalnızca dönüş değerinin bir tamsayı olması, örneğin zemin (sqrt (n)) ve imzasız herhangi bir 32 bit değeri tutabilmesi.
- C / C ++ kullanıyorsanız, sen mesela işaretsiz 64 bit ve 32 bitlik tamsayı türleri olduğunu farzedelim edebilir
uint64_tveuint32_ttanımlananstdint.h. Aksi takdirde, tamsayı türünüzün 64 bit işaretsiz tamsayıyı tutabildiğinden emin olun. - Diliniz 64 bit tam sayıları desteklemiyorsa (örneğin, Brainfuck görünüşe göre yalnızca 8 bit tam sayı desteğine sahipse), bununla elinizden gelenin en iyisini yapın ve yanıt başlığınızdaki sınırlamayı belirtin. Bununla birlikte, 64 bitlik bir tamsayıyı nasıl kodlayacağınızı ve 8 bitlik ilkel aritmetik kullanarak karekökünü nasıl doğru bir şekilde elde ederseniz, o zaman size daha fazla güç verebilirsiniz!
- Eğlenin ve yaratıcı olun!
O(log_2 n) === O(log_4 n). log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2