โจทย์
กำหนดจำนวนเต็มบวก หา Digit (หลัก) ที่มีค่าน้อยที่สุด
ตัวอย่าง
N = 154870 → Digits: 1,5,4,8,7,0 → Min = 0
แนวคิด: Modulo 10 Loop
ใช้ n % 10 ดึงหลักสุดท้าย แล้ว n /= 10 ตัดหลักสุดท้าย ทำซ้ำจน n == 0
โค้ด C++
#include <iostream>
using namespace std;
int smallestDigit(int n) {
if (n == 0) return 0; // Edge case
int minDigit = n % 10; // เริ่มจากหลักสุดท้าย
n /= 10;
while (n != 0) {
int digit = n % 10;
if (digit < minDigit) minDigit = digit;
n /= 10;
}
return minDigit;
}
// Alternative: String conversion
int smallestDigitStr(int n) {
string s = to_string(n);
char minChar = *min_element(s.begin(), s.end());
return minChar - '0';
}
// Handle negative numbers
int smallestDigitAbs(int n) {
n = abs(n);
return smallestDigit(n);
}
int main() {
cout << smallestDigit(154870) << endl; // 0
cout << smallestDigit(98765) << endl; // 5
cout << smallestDigit(11111) << endl; // 1
cout << smallestDigit(0) << endl; // 0
cout << smallestDigit(-503) << endl; // 0 (with abs)
return 0;
}
Edge Cases
n = 0: Return 0 (Special case, Loop ไม่เข้า)n < 0: ใช้abs(n)หรือ Handle แยกn = INT_MIN:abs(INT_MIN)Overflow → ใช้long longหรือ Handle แยก
Complexity
- Time: O(log₁₀ n) - จำนวนหลักของตัวเลข
- Space: O(1)
ผลลัพธ์
0 5 1 0 0
การประยุกต์: หาตัวเลขมากที่สุด
int largestDigit(int n) {
if (n == 0) return 0;
int maxDigit = n % 10;
n /= 10;
while (n) {
maxDigit = max(maxDigit, n % 10);
n /= 10;
}
return maxDigit;
}
สรุป
หา Digit Min/Max ใช้ Modulo 10 Loop แบบ O(log n) เรียบง่าย ไม่ต้องแปลง String (แต่ String ง่ายกว่าสำหรับ Prototyping)