โจทย์
ทำการหาร n ด้วย 2 ซ้ำ ๆ โดยปัดเศษทิ้ง (หารจำนวนเต็ม) จนกว่าจะเหลือ 1 นับจำนวนครั้งที่ต้องหาร
เขียนฟังก์ชัน halve_until_one(n)
อินพุต
n: จำนวนเต็มบวก
เอาต์พุต
คืนค่าจำนวนครั้งที่ต้องหาร
เงื่อนไข
1 ≤ n ≤ 1,000,000,000,000
ตัวอย่าง
อินพุต:
n = 20
ผลลัพธ์ที่คาดหวัง:
expected = 4
อินพุต:
long long n = 20;
ผลลัพธ์ที่คาดหวัง:
long long expected = 4;
อินพุต:
long n = 20;
ผลลัพธ์ที่คาดหวัง:
long expected = 4;
คำอธิบาย
20 → 10 → 5 → 2 → 1 ใช้การหาร 4 ครั้ง
อินพุต:
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 กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน