On this page
โจทย์คณิตศาสตร์ & ตรรกะ
FizzBuzz, จำนวนเฉพาะ, factorial, ผลรวมหลัก — โจทย์คลาสสิกที่ฝึกการแปลงตรรกะเป็นโค้ด
โจทย์คณิต-ตรรกะฝึกการแปลงปัญหาคณิตศาสตร์เป็นโค้ด หลายข้อเป็นโจทย์สัมภาษณ์ในตำนาน (เช่น FizzBuzz) ที่ใช้คัดกรองว่าเขียนโปรแกรมพื้นฐานเป็นจริงไหม
ข้อ 1 — FizzBuzz 🟢
พิมพ์เลข 1 ถึง n แต่: หาร 3 ลงตัวพิมพ์ "Fizz", หาร 5 ลงตัวพิมพ์ "Buzz", หารทั้ง 3 และ 5 ลงตัวพิมพ์ "FizzBuzz", นอกนั้นพิมพ์เลขนั้น
เช็คเงื่อนไข "หารทั้ง 3 และ 5" (คือหาร 15) ก่อนเป็นอันดับแรก ไม่งั้นจะไม่มีวันเข้าเงื่อนไขนั้นเลย
เฉลย + คำอธิบาย
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)
เฉลย + คำอธิบาย
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)
เฉลย + คำอธิบาย
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 และแบบใช้ % กับ //)
เฉลย + คำอธิบาย
# แบบ 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
เฉลย + คำอธิบาย
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 ไหม การฝึกโจทย์คณิตช่วยให้แปลงตรรกะเป็นโค้ดได้คล่อง