โจทย์
กำหนดหมายเลขตำแหน่งของแต่ละหลักใน n จากซ้าย โดยเริ่มที่ 1 ให้นำแต่ละหลักมายกกำลังตามตำแหน่งของมัน แล้วนำผลลัพธ์ทั้งหมดมาบวกกัน สำหรับ 352 จะได้ 3¹ + 5² + 2³ หลักที่เป็นศูนย์จะได้ค่า 0
ให้เขียนฟังก์ชัน digit_power_sum(n)
อินพุต
n: จำนวนเต็มบวก
เอาต์พุต
คืนค่าผลรวมของแต่ละหลักที่ถูกยกกำลังตามตำแหน่ง
เงื่อนไข
1 ≤ n ≤ 1,000,000,000
ตัวอย่าง
อินพุต:
n = 352
ผลลัพธ์ที่คาดหวัง:
expected = 36
อินพุต:
long long n = 352;
ผลลัพธ์ที่คาดหวัง:
long long expected = 36;
อินพุต:
long n = 352;
ผลลัพธ์ที่คาดหวัง:
long expected = 36;
คำอธิบาย
3¹ + 5² + 2³ = 3 + 25 + 8 = 36
อินพุต:
n = 89
ผลลัพธ์ที่คาดหวัง:
expected = 89
อินพุต:
long long n = 89;
ผลลัพธ์ที่คาดหวัง:
long long expected = 89;
อินพุต:
long n = 89;
ผลลัพธ์ที่คาดหวัง:
long expected = 89;
คำอธิบาย
8¹ + 9² = 8 + 81 = 89 ซึ่งเท่ากับตัวเลขเอง
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
ไล่ดูเลขทีละหลักจากซ้ายไปขวา แล้วเก็บตำแหน่งของแต่ละหลักไว้
คำใบ้ 2
แปลงเลขเป็นสตริง หรือหาวิธีรู้ index จากซ้ายก่อนเอาแต่ละหลักไปคำนวณกับตำแหน่งของมัน
คำใบ้ 3
จำไว้ว่าเลข 0 ไม่เพิ่มค่าอะไร แต่ตำแหน่งของมันยังมีผลกับเลขชี้กำลัง
ความซับซ้อนที่คาดหวัง
เวลา O(d), หน่วยความจำเพิ่ม O(1)