ปัญหา:
ในภาษาที่คุณเลือกให้เขียนฟังก์ชันที่สั้นที่สุดที่ส่งคืนพื้นของสแควร์รูทของจำนวนเต็ม 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 ++ คุณอาจถือว่าการดำรงอยู่ของไม่ได้ลงนาม 64 บิตและ 32 บิตจำนวนเต็มประเภทเช่นที่
uint64_t
และตามที่กำหนดในuint32_t
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