ได้รับจำนวนเต็ม N งานคือแทนที่ 0 ทั้งหมดที่ปรากฏในตัวเลขด้วย '5' อย่างไรก็ตาม ตัวเลขที่มี 0 นำหน้า (leading zeros) ไม่สามารถแทนที่ด้วย 5 ได้ เพราะจะคงค่าเดิม ตัวอย่างเช่น
ตัวอย่างอินพุต 1
N = 1007
เอาต์พุต
1557
คำอธิบาย
ตัวเลขที่กำหนดมี 0 สองตัว ซึ่งเมื่อแทนที่ด้วย '5' จะได้เอาต์พุตเป็น 1557
ตัวอย่างอินพุต 2
N = 00105
เอาต์พุต
155
คำอธิบาย
เนื่องจากตัวเลขที่กำหนดเริ่มต้นด้วย 0 นำหน้าซึ่งสามารถข้ามได้ และเอาต์พุตหลังจากแทนที่ 0 กลางด้วย '5' จะได้ผลลัพธ์เป็น 155
วิธีการแก้ปัญหา
เพื่อแทนที่ 0 ทั้งหมดในตัวเลขที่กำหนดด้วย '5' เราสามารถหาและแยกตัวเลขหลักสุดท้ายของตัวเลขได้ หากหลักสุดท้ายของตัวเลขนั้นเป็น '0' ให้เปลี่ยนและแทนที่ค่าด้วย '5' และแยกตัวเลขอีกตัว อย่างไรก็ตาม 0 นำหน้าของตัวเลขที่กำหนดต้องถูกข้าม
ปัญหานี้สามารถแก้ได้โดยใช้วิธี recursion โดยเราจะแยกหลักสุดท้ายก่อน แล้วเรียกฟังก์ชันเดียวกันอีกครั้งขณะแยกตัวเลขอื่นของตัวเลขนั้น
- รับอินพุตตัวเลข N
- ฟังก์ชัน Integer convertToFive(int N) รับตัวเลขเป็นอินพุตและคืนค่าตัวเลขที่ปรับเปลี่ยนแล้วโดยการแทนที่ 0 ทั้งหมดด้วย '5'
- ในกรณีฐาน (base case) ถ้าตัวเลขเป็น '0' ให้คืนค่า 0 มิฉะนั้นแยกหลักสุดท้ายของตัวเลขนั้นและตรวจสอบ
- ถ้าหลักสุดท้ายของตัวเลขเป็น '0' ให้แทนที่ค่าด้วย '5'
- คืนค่าฟังก์ชัน recursive ที่รับตัวเลขอื่นของตัวเลขโดยการหาร '10' และคูณด้วย '10'
- คืนค่าเอาต์พุทที่แยกหลักสุดท้ายโดยการบวกเข้าไป
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
int convertToFive(int N) {
if (N == 0) {
return 0;
}
int last_digit = N % 10;
if (last_digit == 0)
last_digit = 5;
return convertToFive(N / 10) * 10 + last_digit;
}
int main() {
int N = 14006;
cout << convertToFive(N) << endl;
return 0;
}
ผลลัพธ์
ถ้าเราจะรันโค้ดด้านบน จะพิมพ์เอาต์พุตเป็น
14556
เนื่องจากมี 0 สองตัวในตัวเลขที่กำหนด หลังจากแทนที่ตัวเลข 14006 จะกลายเป็น 14556