Toán học và lập trình luôn đi đôi với nhau — số liệu có mặt khắp nơi trong lập trình. Cho dù bạn đang kiểm tra xem một số có phải là số nguyên tố hay không, tạo ra các chuỗi Fibonacci, hoặc phát hiện một số đối xứng, những thử thách nhỏ này sẽ rèn luyện cả kỹ năng toán học và logic lập trình của bạn. 

Trong bài viết này, chúng ta sẽ khám phá 20 bài tập lập trình thân thiện với người mới bắt đầu dựa trên số học. Đối với mỗi bài, bạn sẽ nhận được một giải thích nhanh về khái niệm toán học, một số đầu vào và đầu ra mẫu, cùng với một giải pháp Python sẵn sàng chạy. Đây là một cách thú vị để thực hành lập trình trong khi học cách các ý tưởng toán học như số hoàn hảo, số lập phương, và số tam giác có thể sống động trong mã.

1. Tổng của N Số Tự Nhiên Đầu Tiên

Yêu cầu của bài tập:

Viết một chương trình để tìm tổng của n số tự nhiên đầu tiên. Điều này giúp bạn thực hành các vòng lặp hoặc công thức toán học.

Số tự nhiên là gì?

Số tự nhiên là các số đếm bắt đầu từ 1: 1, 2, 3, 4, …

Đầu vào mẫu

5

Đầu ra mẫu

15

Giải pháp Python

# Đọc n và tính tổng của n số tự nhiên đầu tiên bằng công thức dạng đóng
n = int(input("Nhập n: "))
# Sử dụng phép toán số nguyên (//) để tránh số thực
total = n * (n + 1) // 2
print(total)

2. Kiểm Tra Số Chẵn Hay Lẻ

Yêu cầu của bài tập:

Nhập một số nguyên và in ra xem nó là số chẵn hay số lẻ.

Số chẵn/lẻ là gì?

Số chẵn là những số chia hết cho 2 (ví dụ: 2, 4, 6). Số lẻ có số dư 1 khi chia cho 2 (ví dụ: 1, 3, 5).

Đầu vào mẫu

7

Đầu ra mẫu

7 là số lẻ

Giải pháp Python

# Xác định xem số nguyên đầu vào là số chẵn hay số lẻ bằng phép chia dư
n = int(input("Nhập một số: "))
if n % 2 == 0:
    print(f"{n} là số chẵn")
else:
    print(f"{n} là số lẻ")

3. Kiểm Tra Số Nguyên Tố

Yêu cầu của bài tập:

Viết một chương trình để kiểm tra xem một số cho trước có phải là số nguyên tố hay không.

Số nguyên tố là gì?

Một số nguyên tố lớn hơn 1 và chỉ chia hết cho 1 và chính nó (ví dụ: 2, 3, 5, 7).

Đầu vào mẫu

13

Đầu ra mẫu

13 là số nguyên tố

Giải pháp Python

# Kiểm tra tính nguyên tố bằng cách thử chia đến sqrt(n)
n = int(input("Nhập một số: "))
if n < 2:
    print(f"{n} không phải là số nguyên tố")
else:
    for d in range(2, int(n**0.5) + 1):
        if n % d == 0:
            print(f"{n} không phải là số nguyên tố")
            break
    else:
        print(f"{n} là số nguyên tố")

4. Tổng Các Chữ Số

Yêu cầu của bài tập:

Tính tổng tất cả các chữ số của một số.

Tại sao tổng chữ số lại quan trọng?

Tổng chữ số xuất hiện trong các quy tắc chia hết và nhiều câu đố số khác nhau (ví dụ: chia hết cho 3 nếu tổng chữ số chia hết cho 3).

Đầu vào mẫu

1234

Đầu ra mẫu

10

Giải pháp Python

# Tính tổng các chữ số bằng cách lặp qua các ký tự và chuyển đổi thành số nguyên
s = input("Nhập một số: ").strip()
digit_sum = sum(int(ch) for ch in s if ch.isdigit())
print(digit_sum)

5. Kiểm Tra Số Đối Xứng

Yêu cầu của bài tập:

Kiểm tra xem một số có đọc giống nhau từ trái sang phải và từ phải sang trái hay không.

Số đối xứng là gì?

Một số như 121, 1331, hoặc 12321 mà vẫn giống nhau khi đảo ngược.

Đầu vào mẫu

12321

Đầu ra mẫu

12321 là số đối xứng

Giải pháp Python

# So sánh chuỗi với chuỗi đảo ngược để kiểm tra số đối xứng
s = input("Nhập một số: ").strip()
print(f"{s} là số đối xứng" nếu s == s[::-1] else f"{s} không phải là số đối xứng")

6. Tìm Tất Cả Các ước của Một Số

Yêu cầu của bài tập:

Liệt kê tất cả các số chia hết cho n.

Các ước là gì?

Các ước là các số nguyên mà bạn có thể nhân để có được n. Đối với 12, các ước là 1, 2, 3, 4, 6, 12.

Đầu vào mẫu

12

Đầu ra mẫu

1 2 3 4 6 12

Giải pháp Python

# Tạo tất cả các ước bằng cách kiểm tra từ 1..n
n = int(input("Nhập một số: "))
factors = [d for d in range(1, n+1) if n % d == 0]
print(" ".join(map(str, factors)))

7. Kiểm Tra Số Hoàn Hảo

Yêu cầu của bài tập:

Kiểm tra xem n có bằng tổng các ước của nó (không bao gồm chính nó) hay không.

Số hoàn hảo là gì?

Các số như 6 (=1+2+3) và 28 (=1+2+4+7+14) là số hoàn hảo.

Đầu vào mẫu

28

Đầu ra mẫu

28 là số hoàn hảo

Giải pháp Python

# Tính tổng các ước (không bao gồm n) và so sánh với n
n = int(input("Nhập một số: "))
proper = [d for d in range(1, n) if n % d == 0]
print(f"{n} là số hoàn hảo" nếu sum(proper) == n else f"{n} không phải là số hoàn hảo")

8. Kiểm Tra Số Armstrong (Narcissistic)

Yêu cầu của bài tập:

Kiểm tra xem n có bằng tổng các chữ số của nó nâng lên lũy thừa của số chữ số hay không.

Số Armstrong là gì?

Ví dụ: 153 = 1³ + 5³ + 3³; 9474 = 9⁴ + 4⁴ + 7⁴ + 4⁴.

Đầu vào mẫu

153

Đầu ra mẫu

153 là số Armstrong

Giải pháp Python

# Nâng mỗi chữ số lên lũy thừa của tổng số chữ số và tính tổng
s = input("Nhập một số: ").strip()
p = len(s)
arm = sum(int(ch)**p for ch in s)
print(f"{s} là số Armstrong" nếu arm == int(s) else f"{s} không phải là số Armstrong")

9. Kiểm Tra Số Bình Phương Hoàn Hảo

Yêu cầu của bài tập:

Kiểm tra xem một số có phải là số bình phương hoàn hảo hay không.

Số bình phương hoàn hảo là gì?

Một số có thể được viết dưới dạng k² (ví dụ: 4, 9, 16, 25).

Đầu vào mẫu

49

Đầu ra mẫu

49 là số bình phương hoàn hảo

Giải pháp Python

# Sử dụng căn bậc hai nguyên để tránh các vấn đề với số thực
import math
n = int(input("Nhập một số: "))
print(f"{n} là số bình phương hoàn hảo" nếu math.isqrt(n)**2 == n else f"{n} không phải là số bình phương hoàn hảo")

10. Kiểm Tra Số Lập Phương Hoàn Hảo

Yêu cầu của bài tập:

Kiểm tra xem một số có phải là số lập phương hoàn hảo hay không.

Số lập phương hoàn hảo là gì?

Một số có thể được biểu diễn dưới dạng k³ (ví dụ: 8, 27, 64).

Đầu vào mẫu

27

Đầu ra mẫu

27 là số lập phương hoàn hảo

Giải pháp Python

# Xấp xỉ căn bậc ba bằng cách làm tròn và xác minh bằng cách lập phương lại
n = int(input("Nhập một số: "))
croot = round(n ** (1/3))
print(f"{n} là số lập phương hoàn hảo" nếu croot**3 == n else f"{n} không phải là số lập phương hoàn hảo")

11. Bộ Sinh Chuỗi Fibonacci

Yêu cầu của bài tập:

Phát sinh n số Fibonacci đầu tiên.

Số Fibonacci là gì?

Chuỗi bắt đầu từ 0, 1, trong đó mỗi số mới là tổng của hai số trước đó: 0, 1, 1, 2, 3, 5, 8, …

Đầu vào mẫu

7

Đầu ra mẫu

0 1 1 2 3 5 8

Giải pháp Python

# Xây dựng chuỗi Fibonacci một cách lặp lại bằng cách sử dụng hai biến theo dõi
n = int(input("Nhập n: "))
a, b = 0, 1
seq = []
for _ in range(n):
    seq.append(a)
    a, b = b, a + b
print(" ".join(map(str, seq)))

12. Kiểm Tra Một Số Có Trong Chuỗi Fibonacci Không

Yêu cầu của bài tập:

Kiểm tra xem một số cho trước có thuộc chuỗi Fibonacci hay không.

Thực tế toán học:

n là số Fibonacci nếu (5n² + 4) hoặc (5n² − 4) là số bình phương hoàn hảo.

Đầu vào mẫu

21

Đầu ra mẫu

21 là số Fibonacci

Giải pháp Python

# Sử dụng kiểm tra số bình phương hoàn hảo 5n^2±4 để kiểm tra thành viên Fibonacci
import math

def is_square(x: int) -> bool:
    return math.isqrt(x)**2 == x

n = int(input("Nhập một số: "))
if is_square(5*n*n + 4) or is_square(5*n*n - 4):
    print(f"{n} là số Fibonacci")
else:
    print(f"{n} không phải là số Fibonacci")

13. Kiểm Tra Số Tam Giác

Yêu cầu của bài tập:

Kiểm tra xem n có phải là số tam giác: n = k(k+1)/2 cho một số nguyên k nào đó.

Số tam giác là gì?

Chúng tạo thành các tam giác chấm: 1, 3, 6, 10, 15, …

Đầu vào mẫu

15

Đầu ra mẫu

15 là số tam giác

Giải pháp Python

# Giải quyết k(k+1)/2 = n bằng cách kiểm tra k = floor((sqrt(8n+1)-1)/2)
import math
n = int(input("Nhập một số: "))
k = int((math.isqrt(8*n + 1) - 1) // 2)
print(f"{n} là số tam giác" nếu k * (k + 1) // 2 == n else f"{n} không phải là số tam giác")

14. Số Rationale (Thập Phân → Phân Số)

Yêu cầu của bài tập:

Chuyển đổi một số thập phân thành phân số đơn giản p/q.

Số hợp lý là gì?

Một số có thể được biểu diễn dưới dạng tỷ lệ của các số nguyên (ví dụ: 0.75 = 3/4).

Đầu vào mẫu

0.75

Đầu ra mẫu

3/4

Giải pháp Python

# Sử dụng Fraction để chuyển đổi thập phân sang dạng p/q và đơn giản hóa
from fractions import Fraction
x = float(input("Nhập một số thập phân: "))
print(Fraction(x).limit_denominator())

15. Kiểm Tra Số Tam Giác

Yêu cầu của bài tập:

Kiểm tra xem một số có phải là số tam giác, có nghĩa là nó có thể tạo thành một tam giác đều.

Số tam giác là gì?

Các số tam giác là tổng của n số tự nhiên đầu tiên: 1, 3, 6, 10, 15…

Đầu vào mẫu

10

Đầu ra mẫu

10 là số tam giác

Giải pháp Python

import math

n = int(input("Nhập một số: "))
# Công thức: nếu 8n+1 là số bình phương hoàn hảo, thì n là số tam giác
check = 8 * n + 1
if int(math.isqrt(check))**2 == check:
    print(f"{n} là số tam giác")
else:
    print(f"{n} không phải là số tam giác")

16. Bộ Sinh Chuỗi Fibonacci

Yêu cầu của bài tập:

Phát sinh chuỗi Fibonacci đến n số.

Chuỗi Fibonacci là gì?

Đó là một chuỗi mà mỗi số là tổng của hai số trước đó: 0, 1, 1, 2, 3, 5, 8…

Đầu vào mẫu

7

Đầu ra mẫu

0 1 1 2 3 5 8

Giải pháp Python

n = int(input("Nhập số lượng số: "))
a, b = 0, 1
for _ in range(n):
    print(a, end=" ")
    a, b = b, a + b

17. Tổng Các Chữ Số

Yêu cầu của bài tập:

Tính tổng tất cả các chữ số trong một số cho trước.

Điều đó có nghĩa là gì?

Ví dụ: các chữ số của 1234 là 1+2+3+4 = 10.

Đầu vào mẫu

1234

Đầu ra mẫu

10

Giải pháp Python

n = input("Nhập một số: ")
# Chuyển đổi mỗi ký tự trở lại thành số nguyên và tính tổng
s = sum(int(d) for d in n)
print(s)

18. Đảo Ngược Một Số

Yêu cầu của bài tập:

Đảo ngược các chữ số của số cho trước.

Điều đó có nghĩa là gì?

Ví dụ: 12345 trở thành 54321.

Đầu vào mẫu

12345

Đầu ra mẫu

54321

Giải pháp Python

n = input("Nhập một số: ")
# Sử dụng cắt để đảo ngược
print(n[::-1])

19. Ước Số Chung Lớn Nhất (GCD)

Yêu cầu của bài tập:

Tìm số lớn nhất chia hết cho hai số nguyên mà không có số dư.

GCD là gì?

Ước số lớn nhất chung cho cả hai số. Ví dụ: gcd(12, 18) = 6.

Đầu vào mẫu

12 18

Đầu ra mẫu

6

Giải pháp Python

import math

a, b = map(int, input("Nhập hai số: ").split())
# Sử dụng math.gcd để tiết kiệm thời gian
print(math.gcd(a, b))

20. Bội Số Chung Nhỏ Nhất (LCM)

Yêu cầu của bài tập:

Tìm số nhỏ nhất chia hết cho cả hai số nguyên đã cho.

LCM là gì?

Bội số chung nhỏ nhất của hai số. Ví dụ: lcm(4, 6) = 12.

Đầu vào mẫu

4 6

Đầu ra mẫu

12

Giải pháp Python

import math

a, b = map(int, input("Nhập hai số: ").split())
# Công thức: lcm(a, b) = abs(a*b) // gcd(a, b)
print(abs(a*b) // math.gcd(a, b))