Categories: Tổng hợp

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

Published by

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

This post was last modified on 05/02/2024 10:31

Published by

Bài đăng mới nhất

Con số may mắn hôm nay 3/10/2024 theo tuổi: Xin số ông ĐỊA, ăn ngay lộc VÀNG

Con số may mắn hôm nay 3/10/2024 theo tuổi: Xin số ông DIAH, nhận ngay…

13 giờ ago

Tử vi thứ 5 ngày 3/10/2024 của 12 con giáp: Tý nóng nảy, Sửu sáng suốt

Tử vi thứ Năm ngày 3/10/2024 của 12 con giáp: Tý nóng nảy, Sửu khôn…

13 giờ ago

4 con giáp bị tiểu nhân nhòm ngó, tháng 10/2024 khó khăn trăm bề

4 con giáp bị kẻ xấu để mắt tới, tháng 10/2024 sẽ vô cùng khó…

16 giờ ago

Con giáp thành danh nhờ vào bản lĩnh chứ không phải vì đã "ngồi" sẵn trên đống vàng

Con giáp nổi tiếng nhờ sự dũng cảm chứ không phải vì đã "ngồi" trên…

17 giờ ago

Vận mệnh người tuổi Sửu theo giờ sinh: Bạn có phải là người may mắn trời sinh?

Vận mệnh người tuổi Sửu theo giờ sinh: Bạn có phải là người may mắn?

20 giờ ago

Top 3 con giáp vận đỏ giữa tuần (2-4/10) làm gì cũng nhiều lộc

Top 3 con giáp đỏ vào giữa tuần (2-4/10) sẽ gặp nhiều may mắn trong…

22 giờ ago