Số Chính Phương Là Gì ? Các Hàm Tìm Số Chính Phương

Sign in Sign in Welcome!Log into your account your username your password Forgot your password? Password recovery Recover your password your email Search Sunday, January 25, 2026
  • Sign in / Join
Sign in Welcome! Log into your account your username your password Forgot your password? Get help Password recovery Recover your password your email A password will be e-mailed to you. sinhvientot.net sinhvientot.net sinhvientot.net sinhvientot.net Home Lập trình C/C++ Số chính phương là gì ? các hàm tìm số chính phương Facebook Twitter Pinterest WhatsApp

Trong các bài toán căn bản về lập trình thì bài toán tìm số chính phương là một trong các bài toán được xem là kinh điển của lập trình. Hôm nay chúng ta sẽ cũng tìm hiểu về chủ đề này.

Số chính phương là gì?

Số chính phương là số khi lấy căn bậc 2 của nó ta được một số nguyên hay có thể hiểu số chính phương là số có kết quả là bình phương của một số nguyên.

Một số ví dụ tìm số chính phương

Ví dụ 1: Nhập một số từ bàn phím và kiểm tra có phải là số chính phương hay không

Thuật toán: lấy căn của số vừa nhập và ép kiểu về kiểu số nguyên, sau đó bình phương số đã ép kiểu. nếu sau khi bình phương kết quả bằng số ban đầu thì kết luận số vừa nhập là số chính phương, ngược lại không phải

Code C/C++

#include<stdio.h> #include<conio.h> #include<math.h> void main() { int x; printf("Nhap 1 so nguyen: "); scanf("%d", &x); if (x > 3) { int a = sqrt((double)x); if (a*a == x) printf("%d la so chinh phuong", x); else { printf("%d khong la so chinh phuong", x); } } else printf("%d khong la so chinh phuong",x); getch(); }

Ví dụ 2: Tìm các số có trong 1 khoảng [x,y]  nhập từ bàn phím ( khoảng từ [1-10] ) và xuất ra màn hình

Thuật toán:

Chạy từ x đến y,

Kiểm tra tất cả các giá trị đã đi qua, nếu thỏa thì xuất ra màn hình.

Để kiểm tra thì chúng ta cần phải có 1 hàm kiểm tra số chính phương

Code C/C++

Hàm kiểm tra:

int KTchinhphuong(int a) { if (a>3) { if (a == int(sqrt(double(a)))*int(sqrt(double(a)))) // ép kiểu về số nguyên return 1; // đúng trả về 1 else return 0; // sai trả về 0 } return 0; }

Hàm liệt kê:

void Lietkechinhphuong (int x, int y) { for(int i=x ; i<=y ; i++) if(KTchinhphuong(i)==1) // gọi hàm kiểm tra số chính phương printf("%5d",i); }

Ví dụ 3: Tìm và xuất ra màn hình các số chính phương có trong mảng 1 chiều

Thuật toán: Đi từ đầu mảng đến cuối mảng, kiểm tra tất cả các giá trị nếu thỏa thì xuất ra màn hình theo yêu cầu. Để thao tác trên mảng thì chúng ta cần tạo ra mảng 1 chiều. xem thêm ở bài viết Nhập xuất mảng một chiều

Code C/C++

//Tạo mảng: void NhapMang1C(int a[], int &n) { do { printf("Nhap so phan tu mang: "); scanf("%d", &n); }while (n<1); for (int i=0;i<n;i++) { printf("Nhap phan tu a[%d] : ", i); scanf("%d", &a[i]); } } //Xuất mảng void XuatMang1C (int a[] , int n) { for (int i=0 ; i<n ; i++) printf("%4d",a[i]); } //Hàm kiểm tra: int KTchinhphuong(int a) { if (a>3) { if (a == int(sqrt(double(a)))*int(sqrt(double(a)))) // ép kiểu về số nguyên return 1; // đúng trả về 1 else return 0; // sai trả về 0 } return 0; } //Hàm xuất các số chính phương của mảng void Lietkechinhphuong(int a[], int n) { for (int i = 0; i <= n; i++) if (KTchinhphuong(i) == 1) // gọi hàm kiểm tra số chính phương printf("%5d", i); } //Hàm main: void main() { // khai báo mảng và biến int a[100],n; NhapMang1C(a,n); Lietkechinhphuong(a,n); getch(); }

Ví dụ 4: Tìm và xuất ra màn hình các số chính phương của ma trận a[n,m].

Thuật toán: Để thao tác trên ma trận thì chúng ta cần tạo ra một mảng 2 chiều, sau đó tương tự chúng ta lại kiểm tra điều kiện số chính phương và xuất các số ra như đề bài.

Code C/C++

//Tạo ma trận: #define MaxD 100 #define MaxC 100 void NhapMaTran(int a[][MaxC], int &m, int &n) { do { printf("Nhap so dong: "); scanf("%d", &m); } while (m<=0); do { printf("Nhap so cot: "); scanf("%d", &n); } while (n<=0); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) { printf("Phan tu a[%d][%d]", i, j); scanf("%d", &a[i][j]); } } //Xuất ma trận: void XuatMaTran(int a[][MaxC], int m, int n) { for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) { printf("%5d \n", a[i][j]); } } //Tìm các số chính phương của ma trận: void MaTranSoChinhPhuong(int a[][MaxC], int m, int n) { for (int i = 0; i < m;i++) for (int j = 0; j < n; j++) { if (KTchinhphuong(a[i][j]) == 1) printf("%5d", a[i][j]); } } //Hàm main: void main() { int A[MaxD][MaxC]; int M, N; NhapMaTran(A, M, N); XuatMaTran(A, M, N); printf("Cac so chinh phuong co trong ma tran la:"); MaTranSoChinhPhuong(A, M, N); getch(); }

Kết quả:

Nhap so dong: 5

Nhap so cot: 1

Phan tu a[0][0]2

Phan tu a[1][0]3

Phan tu a[2][0]4

Phan tu a[3][0]5

Phan tu a[4][0] 6

2 3 4 5 6

Cac so chinh phuong co trong ma tran la: 4 9

Trên đây là một số ví dụ về tìm kiếm và liệt kê số chính phương! các bạn có thể xem thêm Số nguyên tố là gì ? Hàm tìm số nguyên tố

Chúc các bạn thành công!

RELATED ARTICLESMORE FROM AUTHOR

C/C++

Sự khác nhau giữa Inline function và Macro trong C

C/C++

Trong ngôn ngữ C/C++ có bao nhiêu vùng nhớ (Memory layout)

C/C++

Cấu trúc dữ liệu danh sách nhân viên

C/C++

Tổng quan File trong C

C/C++

Cấu trúc kiểu dữ liệu sinh viên

C/C++

Cấu trúc mô tả một điểm trên tọa độ xOy

3 COMMENTS

  1. Chào anh Tuấn, Bài viết của anh rất dễ hiểu và giới thiệu toàn diện nhiều cách sử dụng khác nhau từ một hàm kiểm tra số chính phương. Nó thật sự là cần thiết đối với em. Cám ơn anh đã chia sẻ nó rất là chi tiết.

    Thưa anh Tuấn, cách trên của anh là phụ thuộc vào độ chính xác của hàm sqrt(). Em mong muốn tìm 1 cách khác có thể tìm chính xác hơn không phụ thuộc vào hàm nói trên. Em có tìm hiểu thấy có cách tìm số chính phương theo kiểu sau: Em mong anh có thời gian thì giải thích giúp em đoạn code tìm số chính phương trong một lân cận [1, x] với x là số cần kiểm tra. – Em không rõ là số 1 tại sao không hiển thị là số chính phương? – Em nhìn hoài mã vẫn không nghiệm bằng tay được tại sao lại kiểm tra ra được số chính phương? (Nhất là chỗ “return true;”) – Giải thuật này là nhanh hơn hay là cách kiểm tra của anh là nhanh hơn. Tại sao? Mã code như sau: (JAVA) public static boolean isSquareNumber(int x) { int left = 1, right = x, m; while (left x) { right = m – 1; } else { if (m * m < x) { left = m + 1; } else { return true; } } } return false; } Rất mong nhận được sự phản hồi sớm của anh cùng nhiều bài viết mới hay hơn nữa! 😀

    Log in to leave a comment
  2. thuat toan cua anh sai ! So 1 van la so chinh phuong

    Log in to leave a comment
    • Trong bài này, ko kiểm tra số 1 và số 2 bạn

      Log in to leave a comment

LEAVE A REPLY Cancel reply

Log in to leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Danh sách các bài học

Các kiểu dữ liệu cơ bản trong ngôn ngữ C/C++

Mr Good - April 16, 2016 0

Hướng dẫn Tạo Project Visual C++ trong Visual Studio 2012

April 16, 2016

Biến-Hằng-Câu lệnh và biểu thức trong C/C++

April 16, 2016

Cấu trúc IF-ELSE

April 16, 2016

Cấu trúc switch – case

April 16, 2016

Vòng lặp For

April 16, 2016

Cấu trúc While, Do-while

April 16, 2016

Cách sử dụng hàm trong lập trình

April 16, 2016

Mảng một chiều

April 16, 2016 Load more

Bài viết mới nhất

Download

Download Cisco Packet Tracer

Windows 10

Hướng dẫn cài đặt webserver trên localhost để chạy wordpress

HPE

Hướng dẫn cấu hình IP ILO máy chủ HP DL380 Gen10

CentOS

CentOS 8 – Giới thiệu về hệ điều hành Linux (P1)

Load more © Copyright 2016, All Rights Reserved. Donations are always appreciated! MEW: 0x296f1a39d5Ca3cb83C76724eA38af3B90B90109D MORE STORIES

Hướng dẫn sử dụng Cortana trên Window 10

Nguyễn Quí Đức - August 18, 2016 0

Cài đặt Windows Server 2016/2012/2008/2003

Mr Good - April 17, 2016 0

Từ khóa » Số Chính Phương Là Gì C++