[C]. Số Chính Phương

Số chính phương là số bình phương của một số nguyên, như các số 0, 1, 4, 25, 49, 100… Phương pháp để xác định số chính phương như sau:

  1. Tính căn bậc 2 của số N và lưu căn vào một số nguyên, để loại bỏ phần thập phân của căn.
  2. So sánh tích của căn với chính nó và với số N. Nếu bằng nhau, thì N là số chính phương.

Khi N là số chính phương, tính căn bậc 2 của N và lưu vào số nguyên không làm thay đổi giá trị của biến căn, vì phần thập phần bằng 0. Ngược lại, N không phải là số chính phương, khi ta tính căn bậc 2 nhưng lưu vào số nguyên, thì mất phần thập phân có ý nghĩa và dẫn đến thay đổi giá trị của biến căn N. Vì thế, khi nhân ngược lại căn với căn, sẽ không ra được N.

Ví dụ:

  • N = 20, căn = √N = 4.472 ≈ 4, căn * căn = 16 ≠ 20, nên 20 không phải là số chính phương.
  • N = 25, căn = √N = 5.000 = 5, căn * căn = 25 == 25, nên 25 là số chính phương.

Để kiểm tra số chính phương trong code, ta có thể sử dụng đoạn code sau:

#include "stdio.h" 
#include "math.h" 

int cp(int n) { 
    int can = sqrt(n); 
    if (can * can == n) { 
        return 1; // đúng 
    } 
    else { 
        return 0; // sai 
    } 
}

int main() { 
    if (cp(20) == 1) { 
        printf("YESn"); 
    } 
    else { 
        printf("NOn"); 
    } 
    if (cp(25) == 1) 
        printf("YESn"); 
    else 
        printf("NOn"); 
    return 0; 
}

Kết quả của đoạn code trên là “NO YES”.

Bài Tập Số Chính Phương

Bài 1: In ra các số chính phương từ 1 tới N

Đếm các số chính phương từ 1 tới N, bạn có thể sử dụng thuật toán sau:

#include "stdio.h" 
#include "math.h" 

int cp(int n) { 
    int can = sqrt(n); 
    if (can * can == n) { 
        return 1; 
    } 
    else { 
        return 0; 
    } 
}

int main() { 
    int n = 30; 
    for (int i = 1; i <= n; i++) { 
        if (cp(i) == 1) { 
            printf("%d ", i); 
        } 
    } 
    return 0; 
}

Kết quả của đoạn code trên là “1 4 9 16 25”.

Bài 2: Liệt kê các số chính phương từ a tới b

Để liệt kê các số chính phương từ a tới b, ta có thể sử dụng thuật toán sau:

#include "stdio.h" 
#include "math.h" 

int cp(int n) { 
    int can = sqrt(n); 
    if (can * can == n) { 
        return 1; 
    } 
    else { 
        return 0; 
    } 
}

int main() { 
    int a = 10, b = 50; 
    for (int i = sqrt(a); i <= sqrt(b); i++) { 
        printf("%d ", i * i); 
    } 
    return 0; 
}

Để in ra các số chính phương từ a tới b, ta chỉ cần duyệt các số i từ căn bậc hai của a tới căn bậc hai của b và in ra bình phương của i.

Để lưu ý: Cân nhắc giá trị nhỏ hơn căn bậc hai của a, vì nó có thể bị làm tròn xuống và gây sai sót kết quả.

Kết quả của đoạn code trên là “16 25 36 49”.

Xem theo bài giảng của mình về số chính phương: Đây

FEATURED TOPIC