Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

หาตัวเลขน้อยที่สุดในตัวเลข C++

โจทย์

กำหนดจำนวนเต็มบวก หา 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)