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

main frame

1.Số Chính Phương

Số chính phương là số bình phương của một số nguyên, ví dụ như các số 0, 1, 4, 25, 49, 100..

Phương pháp :

  1. Tính căn bậc 2 của N và lưu căn vào số nguyên với mục đích 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ới số N, nếu bằng nhau thì N là số chính phương

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

Ví dụ :

N = 20, can = √N = 4.472 = 4, can * can = 16 != 20 nên 20 không phải là số chính phương

N = 25, can = √N = 5.000 = 5, can * can = 25 == 25 nên 25 là số chính phương

Code :

#include “stdio.h” #include “math.h” int cp(int n){ int can = sqrt(n); if(can * can == n){ return 1; // dung } 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; }

Output :

NO YES

2. 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 các bạn làm tương tự

Code 1. Thuật toán ngây thơ

#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; }

Output :

1 4 9 16 25

Code 2 : Thuật toán tối ưu

Phân tích : Để liệt kê các số chính phương từ 1 tới n ta gọi số chính phương đó có dạng i2 trong đó i là một số nguyên

Từ đó ta có bất phương trình 1 ≤ i2 ≤ n => 1 ≤ i ≤ √n, vậy để in ra các số chính phương từ 1 tới n bạn chỉ cần duyệt các số i từ 1 tới √n và in ra bình phương của i là được.

#include “stdio.h” #include “math.h” int main(){ int n = 30; for(int i = 1; i <= sqrt(n); i++){ printf(“%d “, i * i); } return 0; }

Bài 2. Liệt kê (đếm) các số chính phương từ a tới b.

Code 1. Thuật toán ngây thơ

#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 = a; i <= b; i++){ if(cp(i) == 1){ printf(“%d “, i); } } return 0; }

Output :

16 25 36 49

Code 2 : Thuật toán tối ưu

Phân tích : Để liệt kê các số chính phương từ a tới b ta gọi số chính phương đó có dạng i2 trong đó i là một số nguyên

Từ đó ta có bất phương trình a ≤ i2 ≤ b => √a ≤ i ≤ √b, vậy để in ra các số chính phương từ a tới b bạn chỉ cần duyệt các số i từ √a tới √b và in ra bình phương của i là được.

Bạn cần chú ý cận √a vì nó bị làm tròn xuống nên có thể dẫn đến kết quả bị sai.

#include “stdio.h” #include “math.h” int main(){ int a = 10, b = 50; int c1 = sqrt(a), c2 = sqrt(b); if(c1 * c1 < a){ ++c1; } for(int i = c1; i <= c2; i++){ printf(“%d “, i * i); } return 0; }

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

Da0RIcvk5l0