โจทย์
ได้รับจำนวนเต็ม ต้องการกลับลำดับหลัก (digits) ของตัวเลข
ตัวอย่าง
Input: n = 786521
Output: 125687
อัลกอริทึม
ดึงหลักหน่วย (n % 10) บวกเข้า result แล้วหาร n ด้วย 10 ทำซ้ำจน n = 0
result = 0
while n > 0:
digit = n % 10
result = result * 10 + digit
n = n / 10
วิธีที่ 1: Iterative Approach (แนะนำ)
#include <iostream>
using namespace std;
int reverseDigitsIterative(int n) {
int reversed = 0;
while (n > 0) {
reversed = reversed * 10 + n % 10;
n /= 10;
}
return reversed;
}
int main() {
int n = 4562;
cout << "The number is: " << n << endl;
cout << "Reverse of number is: " << reverseDigitsIterative(n);
return 0;
}
ผลลัพธ์
The number is: 4562 Reverse of number is: 2654
วิธีที่ 2: Recursive Approach
#include <iostream>
using namespace std;
int reverseNumber = 0;
int placeValue = 1;
void reverseDigitsRecursive(int n) {
if (n <= 0) return;
reverseDigitsRecursive(n / 10);
reverseNumber += (n % 10) * placeValue;
placeValue *= 10;
}
int main() {
int n = 4562;
cout << "The number is: " << n << endl;
reverseDigitsRecursive(n);
cout << "Reverse of number is: " << reverseNumber;
return 0;
}
ผลลัพธ์
The number is: 4562 Reverse of number is: 2654
การจัดการกรณีพิเศษ (Edge Cases)
int reverseDigitsSafe(int n) {
// Handle negative numbers
bool negative = n < 0;
if (negative) n = -n;
// Handle overflow (INT_MAX = 2147483647)
long long reversed = 0; // ใช้ long long กัน overflow ระหว่างคำนวณ
while (n > 0) {
reversed = reversed * 10 + n % 10;
if (reversed > INT_MAX) return 0; // หรือ throw exception
n /= 10;
}
return negative ? -reversed : reversed;
}
Complexity
- Time: O(log10 n) - จำนวนรอบเท่ากับจำนวนหลัก
- Space (Iterative): O(1)
- Space (Recursive): O(log10 n) - recursion stack
สรุป
Iterative approach แนะนำมากกว่า: เร็วกว่า, ใช้หน่วยความจำน้อยกว่า, ไม่มี stack overflow risk ต้องระวัง integer overflow และ negative numbers ใน production code