โจทย์ทั้งหมด
ง่าย 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

หารครึ่งจนเหลือหนึ่ง

นับจำนวนครั้งที่ต้องหารครึ่งเพื่อให้ตัวเลขเหลือ 1

สิ่งที่คุณจะได้เรียนรู้

  • วนลูปจนกว่าเงื่อนไขจะเป็นเท็จ
  • นับจำนวนรอบ
  • ใช้การหารปัดเศษ

โจทย์

ทำการหาร n ด้วย 2 ซ้ำ ๆ โดยปัดเศษทิ้ง (หารจำนวนเต็ม) จนกว่าจะเหลือ 1 นับจำนวนครั้งที่ต้องหาร

เขียนฟังก์ชัน halve_until_one(n)

อินพุต

n: จำนวนเต็มบวก

เอาต์พุต

คืนค่าจำนวนครั้งที่ต้องหาร

เงื่อนไข

1 ≤ n ≤ 1,000,000,000,000

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
n = 20

ผลลัพธ์ที่คาดหวัง:
expected = 4
อินพุต:
long long n = 20;

ผลลัพธ์ที่คาดหวัง:
long long expected = 4;
อินพุต:
long n = 20;

ผลลัพธ์ที่คาดหวัง:
long expected = 4;

คำอธิบาย

20 → 10 → 5 → 2 → 1 ใช้การหาร 4 ครั้ง

ตัวอย่างที่ 2
อินพุต:
n = 1

ผลลัพธ์ที่คาดหวัง:
expected = 0
อินพุต:
long long n = 1;

ผลลัพธ์ที่คาดหวัง:
long long expected = 0;
อินพุต:
long n = 1;

ผลลัพธ์ที่คาดหวัง:
long expected = 0;

คำอธิบาย

n เป็น 1 อยู่แล้ว จึงไม่ต้องหารเลย

แนวทางการแก้

ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ

คำใบ้ 1

นับว่าคุณสามารถลดจำนวนลงด้วยการหารสองได้กี่ครั้งก่อนมันจะเป็น 1

คำใบ้ 2

ใช้การหารจำนวนเต็มซ้ำ ๆ ก็พอ ไม่ต้องเก็บเศษที่ทิ้งไป

คำใบ้ 3

อย่าลืมหยุดเมื่อค่าถึง 1 พอดี ไม่ใช่ตอนที่กลายเป็น 0

ความซับซ้อนที่คาดหวัง

เวลา O(log n), หน่วยความจำเพิ่ม O(1)

แหล่งอ้างอิง

โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก