Menu

Tự học Python: Một vài chương trình đơn giản.

Ở bài số 1, chúng ta đã cài đặt môi trường Python, môi trường lập trình và chạy chương trình đầu tiên. Bây giờ mình sẽ viết một số chương trình ví dụ. Đơn giản nhất là chương trình kiểm tra một số có phải là số nguyên tố, hoàn hảo và chính phương hay không (đây là các bài toán cơ bản và đơn giản nhất có thể.

Giới thiệu

Đầu tiên, chúng ta cần nhập vào một số ta gọi tên nó là number nhé. Trong python, không cần khai báo kiểu dữ liệu, vậy bạn chỉ hiểu đơn giản number là một cái tên. Để nhập dữ liệu trong python (v3) ta dùng hàm (khái niệm này sẽ nó sau, nhưng chắc chắn là bạn biết) input.

Ta viết đoạn mã nhập dữ liệu và gán vào biết number như sau:
number = input("Nhap vao mot so: ")
Giải thích một chút: hàm input ở đây đã làm 2 nhiệm vụ của các ngôn ngữ khác (C, Java) đó là vừa in ra màn hình chuỗi Nhap vao mot so: và lấy giá trị mà chúng ta gõ vào để gán cho number.
Bây giờ, nếu ta có lệnh như thế này:
total = number + 10
Khi chạy chương trình, sẽ có một ngoại lệ (lỗi) xuất hiện? Ngoại lệ này do đâu, xem xét kỹ lại một chút, ta thấy hàm input là sẽ chấp nhận bất cứ cái gì ta gõ từ bàn phím vào, vì là bất cứ cái gì cũng được nên nó sẽ coi đó là một chuỗi, và do vậy một chuỗi không thể cộng với một số => xảy ra lỗi.
Vậy, làm thế nào để chúng ta chuyển chuỗi các chữ số thành số thực sự. Câu trả lời rất đơn giản, ta có một hàm chuyển đổi là int. Ta viết lại phép toán trên như sau:
total = int(number) + 10
Lệnh trên chạy đúng và total đúng là bằng tổng giá trị của số mà chúng ta nhập vào với 10 đơn vị nữa.
Hoặc là ta có thể chuyển đổi ngay từ bước nhập số như sau:
number = int(input("Nhap vao mot so: "))
Như vậy, number được coi là số ngay sau khi nhập.

Số nguyên tố

Số nguyên tố không quá xa lại đối với người học toán. Nó là các số nguyên dương chỉ chia hết cho 1 và chính nó. Các số nguyên tố đầu tiên là: 2, 3, 5, 7, ....
Như vậy, để kiểm tra một số có phải là số nguyên tố không thì ta cần kiểm tra:
  1. là số nguyên > 1 (<= 1 không phải là số nguyên tố)
  2. bằng 2 (hai là số nguyên tố chẵn duy nhất)
  3. nếu >= 3 thì chúng ta xem số cần kiểm tra có chia hết cho bất cứ số nào trong pham vi từ 2 đến số nguyên lớn nhất nhưng nhỏ hơn số cần kiểm tra hay không.
number = int(input("Nhap vao mot so nguyen: "))

if number < 2:
    print(number, " khong phai la so nguyen to")
elif number == 2:
    print( number, " la so nguyen to")
else:
    isPrimeNumber = True;
    for i in range(2, number):
        if number % i == 0:
            isPrimeNumber = False;
            break
        
    if isPrimeNumber == True:
        print( number, " la so nguyen to")
    else:
        print(number, " khong phai la so nguyen to")
Đoạn mã trên hoạt động theo 3 điều kiện ở trên. Trong trường hợp thứ 3, ta dùng một biết đánh dấu là isPrimeNumber ban đầu gán cho nó là True, nếu tìm thấy một số nào đó trong phạm vi từ 2 đến < number thì mà number chia hết thì đạt isPrimeNumber và nhảy ra khỏi vòng lặp.
Hết vòng lặp, tùy thuộc vào giá trị của isPrimeNumber ta sẽ có kết luận tương ứng.
Bạn thấy thế nào? Quá đơn giản phải không?
Bạn lưu ý, trong vòng lặp ta sẽ cho i chạy từ 2 đến number - 1. Vì ở đây, chúng ta cần kiểm tra xem number có chia hết cho số nào từ 2 đến number - 1 hay không. Nếu bạn chọn sai vòng lặp này  thì chương trình sẽ sai.

Số hoàn hảo

Bài toán kiểm tra một số là số hoàn hảo hay không lại là một bài toán cơ bản. Trước hết, ta định nghĩa số hoàn hảo là số có tổng các ước nhỏ hơn nó bằng chính nó. Ví dụ: 6 có các ước nhỏ hơn 6 là 1, 2 và 3. Mà 1 + 2 + 3 = 6 => 6 là số hoàn hảo, tương tự 8 không là số hoàn hảo vì 8 có các ước là 1, 2 và 4 mà 1 + 2 + 4 = 7 khác 8 => 8 không phải là số hoàn hảo.
Như vậy, để kiểm tra một số có phải là số hoàn hảo ta kiểm tra các trường hợp:
  1. Nếu <= 1 thì không phải là số hoàn hảo.
  2. Ngược lại, number là số hoàn hỏa nếu tổng tất cả các ước nhỏ hơn number phải bằng number,do đó ta cần phải tính tổng các số mà number chia hết.
number = int(input("Nhap vao mot so: "))
if number <= 1:
    print(number, " khong phai la so hoan hao")
else:
    sumDivision = 0
    for i in range(1, number):
        
        if number % i == 0:
            sumDivision += i    #sumDivision = sumDivision + i
    
    if sumDivision == number:
        
        print(number, " la so hoan hao")
    else:
        
        print(number, " khong phai la so hoan hoa")  

Vì có 2 điều kiện, nên ta chỉ sử dụng một cấu trúc if..else.
Ta sử dụng sumDivision để lưu lại tổng của các ước nhỏ hơn number. Cuối cùng, kiểm tra xem sumDivision có bằng number hay không ta sẽ kết luận được number có là số hoàn hảo hay không.
Bạn lưu ý, phải khởi đầu cho sumDivision bằng 0 nhé. Nếu không, rất có thể sumDivision được cấp cho một giá trị bất kỳ thì kết quả của chúng ta không còn đúng nữa. Đồng thời, ta thấy vòng lặp for với i sẽ phải chạy từ 1 đến number-1 (khác với chương trình trước nhé). Vì ở đây, ta cần kiểm tra xem i có phải là ước hay không. Các số bé hơn number rất có thể là ước. Nhưng lưu ý là không thể chạy từ 0 nhé, phép chia dư cho 0 sẽ bị lỗi runtime.

Số chính phương

Bài cuối cùng là kiểm tra một số có phải là số chính phương không. Số chính phương thì không lạ gì với học sinh lớp 7. Số nguyên dương a được gọi là số chính phương nếu tồn tại một số nguyên dương x <= a sao cho x*x == a.
Như vậy, có các trường hợp sau:
  1. Số nhỏ hơn hoặc 0 thì ta không xét (chỉ xét số dương).
  2. Số x cần tìm <= a nên cứu việc tìm từ 1 đến a xem có số nào thỏa mã bình phương của nó bằng a hay không?
number = int(input("Nhap vao mot so nguyen:"))
if number <= 0:
    
    print(number, " khong phai la so chinh phuong")
else:
    
    isSquareNumber = False
    for i in range(1, number + 1):
        
        if i * i == number:
            
            isSquareNumber = True
            break
        
    if isSquareNumber == True:
        print( number, " la so chinh phuong")
    else:
        print(number, " khong phai la so chinh phuong")
Như đã liệt kế, số nhỏ hơn 0 ta không xét. Trường hợp còn lại, ta tìm tất cả các số từ 1 cho đến number và nếu thỏa mã điều kiện i*i==number thì ta đặt isSquareNumber = True và kết thúc việc kiểm tra. Sau vòng lặp, tùy vào giá trị của isSquareNumber mà ta có kết luận tương ứng.
Bạn lưu ý: khác với hai chương trình trên, vòng lặp ở đây chạy đến number, vì sao cần phải chạy đến number, ta để ý có trường hợp đặc biết 1 * 1 == 1 => 1 là số chính phương mà, trong trường hợp ta nhập number=1 thì rõ ràng vòng lặp chạy từ 1 đến 0 => điều này không xảy ra và isSquareNumber vẫn bằng False.

Một điều nữa, ví dụ 1 và 3 điều sử dụng kỹ thuật đánh dấu, tức là dùng một biến khác đề ghi lại trạng thái. Câu hỏi đặt ra là tại sao ở chương trình 1 mình đặt mặc định là True còn ở chương trình 3 thì là False?
Gợi ý: Đúng khi tất cả đều đúng, sai thì chỉ cần 1 cái là đủ?
Các bạn có thể xem mã nguồn tại đây.

4 nhận xét:


  1. Cái bước kiểm tra X có là số nguyên tố hay không thì kiểm tra xem X có chia hết cho số nào trong khoảng 2..sqrt(X) là đủ.

    Trả lờiXóa
  2. Bài số hoàn hảo cũng vậy: nếu a là ước của X thì X/a cũng là ước của X; vậy chỉ cần chạy đến sqrt(X) ; chú ý trường hợp X là số chính phương.

    Trả lờiXóa

  3. Còn bài cuối sao không lấy phần nguyên căn của số X là Y và kiểm tra ngay Y*Y có bằng X ko? :D

    Trả lờiXóa
  4. Cảm ơn @vnese đã góp ý, bạn nói hoàn toàn chính xác chúng ta chỉ cần kiểm tra với các số nhỏ hơn sqrt(x) là đủ. Ở đây, mình viết hướng dẫn này để người mới bắt đầu lập trình có một cái nhìn tự nhiên nhất. Sau đó, mọi người có thể viết lại và cải tiến chương trình cho phù hợp với chương trình của mình.

    Trả lờiXóa