Notes & software courses · Free to learn
Aph's Blog
On this page

โจทย์คณิตศาสตร์ & ตรรกะ

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

FizzBuzz, จำนวนเฉพาะ, factorial, ผลรวมหลัก — โจทย์คลาสสิกที่ฝึกการแปลงตรรกะเป็นโค้ด

โจทย์คณิต-ตรรกะฝึกการแปลงปัญหาคณิตศาสตร์เป็นโค้ด หลายข้อเป็นโจทย์สัมภาษณ์ในตำนาน (เช่น FizzBuzz) ที่ใช้คัดกรองว่าเขียนโปรแกรมพื้นฐานเป็นจริงไหม

ข้อ 1 — FizzBuzz 🟢

พิมพ์เลข 1 ถึง n แต่: หาร 3 ลงตัวพิมพ์ "Fizz", หาร 5 ลงตัวพิมพ์ "Buzz", หารทั้ง 3 และ 5 ลงตัวพิมพ์ "FizzBuzz", นอกนั้นพิมพ์เลขนั้น

คำใบ้

เช็คเงื่อนไข "หารทั้ง 3 และ 5" (คือหาร 15) ก่อนเป็นอันดับแรก ไม่งั้นจะไม่มีวันเข้าเงื่อนไขนั้นเลย

เฉลย + คำอธิบาย
python
for i in range(1, 16):
    if i % 3 == 0 and i % 5 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

กับดักคลาสสิก: ต้องเช็คเงื่อนไขที่ "เข้มงวดที่สุด" (หารทั้ง 3 และ 5) ก่อน เพราะ elif หยุดที่อันแรกที่จริง ถ้าเอา i % 3 ขึ้นก่อน เลข 15 จะพิมพ์ Fizz แทน FizzBuzz การเรียงลำดับเงื่อนไขสำคัญมาก

ข้อ 2 — จำนวนเฉพาะ 🟡

เช็คว่าเลข n เป็นจำนวนเฉพาะไหม (หารลงตัวแค่ 1 กับตัวมันเอง) เช่น 7 เป็น, 9 ไม่เป็น (9 = 3×3)

เฉลย + คำอธิบาย
python
def is_prime(n):
    if n < 2:
        return False           # 0, 1 ไม่ใช่จำนวนเฉพาะ
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False       # หารลงตัว = ไม่ใช่
    return True

print(is_prime(7))   # True
print(is_prime(9))   # False

เคล็ดลับประสิทธิภาพ: เช็คตัวหารแค่ถึง √n พอ (int(n**0.5)+1) เพราะถ้า n มีตัวประกอบที่ใหญ่กว่า √n มันต้องคู่กับตัวที่เล็กกว่า √n ซึ่งเราเจอไปแล้ว ลดจาก O(n) เหลือ O(√n)

ข้อ 3 — factorial 🟢

คำนวณ n! = 1×2×3×...×n เช่น 5! = 120 (ทำแบบ loop)

เฉลย + คำอธิบาย
python
def factorial(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result

print(factorial(5))   # 120

สะสมผลคูณในตัวแปร result เริ่มที่ 1 (เพราะคูณ) แล้ววนคูณ 2 ถึง n เทียบกับการสะสมผลรวมที่เริ่มจาก 0 — ค่าเริ่มต้นต้องเหมาะกับการดำเนินการ (บวกเริ่ม 0, คูณเริ่ม 1)

ข้อ 4 — ผลรวมของหลัก 🟡

หาผลรวมของเลขแต่ละหลัก เช่น 1234 → 1+2+3+4 = 10 (ลองทำทั้งแบบแปลงเป็น string และแบบใช้ % กับ //)

เฉลย + คำอธิบาย
python
# แบบ string (ง่าย)
def digit_sum(n):
    return sum(int(d) for d in str(n))

# แบบคณิต (ใช้ % และ //)
def digit_sum_math(n):
    total = 0
    while n > 0:
        total += n % 10      # หลักสุดท้าย
        n //= 10             # ตัดหลักสุดท้ายออก
    return total

print(digit_sum(1234))      # 10
print(digit_sum_math(1234)) # 10

แบบคณิตน่าสนใจ: n % 10 ได้หลักขวาสุด, n //= 10 ตัดหลักนั้นทิ้ง (1234 → 123) วนจน n เป็น 0 เทคนิค %10 กับ //10 เพื่อแยกหลักเป็น pattern ที่เจอบ่อยในโจทย์ตัวเลข

ข้อ 5 — GCD ห.ร.ม. 🔴

หาตัวหารร่วมมากของเลข 2 ตัว (GCD) เช่น gcd(12, 18) = 6

เฉลย + คำอธิบาย
python
def gcd(a, b):
    while b:
        a, b = b, a % b   # Euclid's algorithm
    return a

print(gcd(12, 18))   # 6
print(gcd(48, 36))   # 12

ใช้อัลกอริทึมยุคลิด (Euclid) อายุ 2000 ปี: gcd(a,b) = gcd(b, a%b) วนจน b เป็น 0 แล้ว a คือคำตอบ บรรทัด a, b = b, a % b สลับค่าพร้อมคำนวณในบรรทัดเดียว — โจทย์นี้สอนว่าบางปัญหามีสูตรสวย ๆ ที่รู้แล้วจะง่ายมาก

ลองต่อยอด

เขียนโปรแกรมหาจำนวนเฉพาะทั้งหมดถึง n (ใช้ is_prime วน), หา fibonacci, เช็คว่าเลขเป็น perfect number ไหม การฝึกโจทย์คณิตช่วยให้แปลงตรรกะเป็นโค้ดได้คล่อง