โจทย์
นำตัวเลขแต่ละหลักของ n มาบวกกัน หากผลลัพธ์มีมากกว่าหนึ่งหลัก ให้นำตัวเลขแต่ละหลักของผลลัพธ์นั้นมาบวกกันอีก ทำซ้ำจนกว่าจะเหลือเพียงตัวเลขหลักเดียว
ให้เขียนฟังก์ชัน digital_root(n)
อินพุต
n: จำนวนเต็มบวก
เอาต์พุต
คืนค่าตัวเลขหลักเดียวสุดท้าย
เงื่อนไข
1 ≤ n ≤ 10¹⁸
ตัวอย่าง
อินพุต:
n = 999
ผลลัพธ์ที่คาดหวัง:
expected = 9
อินพุต:
long long n = 999;
ผลลัพธ์ที่คาดหวัง:
long long expected = 9;
อินพุต:
long n = 999;
ผลลัพธ์ที่คาดหวัง:
long expected = 9;
คำอธิบาย
9 + 9 + 9 = 27, จากนั้น 2 + 7 = 9
อินพุต:
n = 38
ผลลัพธ์ที่คาดหวัง:
expected = 2
อินพุต:
long long n = 38;
ผลลัพธ์ที่คาดหวัง:
long long expected = 2;
อินพุต:
long n = 38;
ผลลัพธ์ที่คาดหวัง:
long expected = 2;
คำอธิบาย
3 + 8 = 11, จากนั้น 1 + 1 = 2
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
บวกเลขหลักซ้ำ ๆ ไปเรื่อย ๆ สุดท้ายจะยุบเหลือเลขหลักเดียว
คำใบ้ 2
จำลองการบวกซ้ำจนกว่าค่าจะน้อยกว่า 10
คำใบ้ 3
ระวังอินพุตที่ใหญ่มาก เพราะงานหลักคือการวนผ่านหลักหลายรอบ
ความซับซ้อนที่คาดหวัง
เวลา O(d log n), หน่วยความจำเพิ่ม O(1)