Số chính phương là gì? Số chính phương là số bằng bình phương đúng của một số nguyên. Hay hiểu đơn giản, số chính phương là một số tự nhiên có căn bậc hai cũng là một số tự nhiên.
Vậy làm sao để kiểm tra được số có phải là số chính phương không trong lập trình C/C++, chúng ta cùng nhau đi giải quyết trong bài viết này nhé.
Kiểm tra số chính phương trong lập trình C/C++
Kiểm tra số chính phương trong lập trình C/C++, đây là một bài toán rất cơ bản mà hầu hết khi chúng ta mới bắt đầu học lập trình đều sẽ phải làm qua bài toán này, những bài toán như vậy giúp chúng ta bước đầu có thể hiểu hơn về tư duy logic trong lập trình.
Các số đầu tiên trong dãy số chính phương là 1, 4, 9, 16, 25, 36, 49, 64….n^n và đây chính là dãy số khi bình phương của dãy số tự nhiên liên tiếp 1, 2, 3, 4, 5, 6, 7, 8…..n.
Chúng ta đã hiểu số chính phương là gì, vậy ý tưởng làm sao để kiểm tra được 1 số có phải là số chính phương hay không trong lập trình C/C++.
Ý Tưởng giải bài toán trong C/C++
Giả sử, ta có số n là số cần kiểm tra có phải là số chính phương hay không. Ý tướng sẽ như sau, ta lấy số n khai căn bậc 2(trong c/c++ ta có hàm sqrt) được một số x, ta sẽ chỉ lấy phần nguyên của số x này. Tức là nếu ta khai căn 1 số ví dụ như được 3 chẳng hạn thì ta lấy x là 3, mà khai căn được 3.1, 3.2xx….3.9xx hay bất kì 1 số thực nào 3<x<4 thì ta đều lấy x chỉ là 3, bỏ hết phần thực phía sau(Trong lập trình ta chỉ cần ép kiểu của biến x thành int).
Sau khi khai căn và chỉ lấy phần nguyên được số x, ta lấy kết quả bình phương của số x, tức là x nhân với x (x*x) so sánh xem nếu bằng với số n ban đầu thì tức là n chính là số chính phương, mà x*x khác n ban đầu tức là số n không phải là số chính phương.
Cụ thể chương trình kiểm tra số chính phương trong C/C++ ta viết như sau:
#include <stdio.h>
#include <math.h>
int main()
{
int n; //Khai báo biến n kiểu số nguyên
printf("Nhap so can kiem tra: ");
scanf("%d", &n); //Nhaập n từ bàn phím
int x = sqrt(n); //Khai báo biến x kiểu số nguyên và gắn luôn giá trị x = với khai căn bậc 2 của n
//=> hàm sqrt trả về số thực nhưng biến x là kiểu số nguyên nên kết quả sẽ tự ép kiểu thành số nguyên
//Nếu x*x mà bằng với n chứng tỏ n là số chính phương
if(x*x == n) printf("%d la so chinh phuong", n);
else printf("%d khong phai la so chinh phuong",n);
}
Ta cũng có thể viết hàm kiểm tra số chính phương thành 1 hàm riêng.
#include <stdio.h>
#include <math.h>
bool check_ChinhPhuong(int n){
int x = sqrt(n);
if(x*x == n) return true; //Nếu x*x bằng n thì trả về hàm là true
return false; //Ta không cần lệnh else vì nếu sảy ra trường hợp trên thì lệnh return trả luôn kết quả cho hàm và không chạy xuống lệnh này, ngược lại thì hàm ms chạy được xuống lệnh này
}
//Hàm này cũng như hàm trên nhưng if else theo kiểu viết gọn lại
bool check_ChinhPhuong2(int n){
int x = sqrt(n);
return x*x == n ? true:false;
}
int main()
{
int n;
printf("Nhap so can kiem tra: ");
scanf("%d", &n);
//if(check_ChinhPhuong(n)) tương đương với if(check_ChinhPhuong(n) == true)
if(check_ChinhPhuong(n)) printf("%d la so chinh phuong", n);
else printf("%d khong phai la so chinh phuong",n);
}
Áp dụng hàm kiểm tra số chính phương vào các bài toán
Sau khi đã có được hàm kiểm tra số chính phương ta có thể áp dụng hàm này vào giải nhiều bài khác nhau như đếm số lượng số chính phương nhỏ n, liệt kê số chính phương nhỏ hơn n, đếm số chính phương trong mảng, liệt kê số chính phương trong mảng…..
Chương trình đếm số lượng số chính phương nhỏ hơn n
#include <stdio.h>
#include <math.h>
bool check_ChinhPhuong2(int n){
int x = sqrt(n);
return x*x == n ? true:false;
}
int main()
{
int n;
printf("Nhap n: ");
scanf("%d", &n);
int dem = 0;
for(int i=1;i<n;i++){
if(check_ChinhPhuong2(i) == true){
dem++;
}
}
//Hiển thị số lượng số chính phương ra màn hình
printf("So luong so chinh phuong nho hon %d: %d", n, dem);
}
Chương trình liệt kê số chính phương nhỏ hơn n
#include <stdio.h>
#include <math.h>
bool check_ChinhPhuong2(int n){
int x = sqrt(n);
return x*x == n ? true:false;
}
int main()
{
int n;
printf("Nhap n: ");
scanf("%d", &n);
printf("\nCac so chinh phuong nho hon %d\n", n);
for(int i=1;i<n;i++){
if(check_ChinhPhuong2(i) == true){
printf("%d ", i);
}
}
}
Chương trình đếm số lượng số chính phương trong mảng 1 chiều
#include <stdio.h>
#include <math.h>
bool check_ChinhPhuong2(int n){
int x = sqrt(n);
return x*x == n ? true:false;
}
int main()
{
int n;
printf("Nhap n: ");
scanf("%d", &n);
int a[n]; //Khai báo biến a gồm n phần tử
//Vòng lặp để nhập n phần tử cho mảng a
for(int i = 0; i<n; i++)
{
printf("a[%d] = ", i);
scanf("%d", &a[i]);
}
int dem = 0; //Khởi tạo biến dem = 0
for(int i=0;i<n;i++){
if(check_ChinhPhuong2(a[i]) == true){
dem++; //Nếu phần tử thứ a[i] trong mảng là số chính phương thì tăng biến đếm lên 1 đơn vị
}
}
//Hiển thị số lượng số chính phương trong mảng ra màn hình
printf("So luong so chinh phuong trong mang: %d", dem);
}
Chương trình liệt kê số chính phương trong mảng 1 chiều
#include <stdio.h>
#include <math.h>
bool check_ChinhPhuong2(int n){
int x = sqrt(n);
return x*x == n ? true:false;
}
int main()
{
int n;
printf("Nhap n: ");
scanf("%d", &n);
int a[n];//Khai báo biến a gồm n phần tử
//Vòng lặp để nhập n phần tử cho mảng a
for(int i = 0; i<n; i++)
{
printf("a[%d] = ", i);
scanf("%d", &a[i]);
}
printf("\nCac so chinh phuong trong mang %d\n", n);
for(int i=0;i<n;i++){
if(check_ChinhPhuong2(a[i]) == true){
printf("%d ", a[i]); //Nếu phần tử thứ a[i] trong mảng là số chính phương in ra màn hình số đó
}
}
}
[Xem tất cả bài viết chủ đề C/C++ tại đây]
XÊM THÊM Cách tìm UCLN và BCNN Thuật toán đếm số lượng chữ số của số nguyên dương n Thuật toán tính dãy số Fibonacci Bài toán chuẩn hóa xâu ký tự