code kiểm tra số hoàn hảo bằng C++
Trước tiên, các em hãy nhớ lại kiến thức đã học về các phép toán cơ bản trong lập trình C++ và cách sử dụng vòng lặp. Đó sẽ là những công cụ quan trọng để chúng ta giải quyết bài toán này.
1. Số hoàn hảo là gì?
Số hoàn hảo là một số nguyên dương, có tính chất đặc biệt là tổng các ước số dương của nó (không bao gồm chính nó) bằng chính nó.
Ví dụ:
– Số 6: Các ước số dương của 6 là 1, 2, 3, 6.
Các ước số dương không bao gồm chính nó là 1, 2, 3.
Tổng các ước số này là: 1 + 2 + 3 = 6.
Vì vậy, 6 là một số hoàn hảo.
– Số 28: Các ước số dương của 28 là 1, 2, 4, 7, 14, 28.
Các ước số dương không bao gồm chính nó là 1, 2, 4, 7, 14.
Tổng các ước số này là: 1 + 2 + 4 + 7 + 14 = 28.
Vì vậy, 28 là một số hoàn hảo.
2. Ý tưởng để viết chương trình
Để kiểm tra một số \(n\) có phải là số hoàn hảo hay không, chúng ta cần thực hiện các bước sau:
a. Tìm tất cả các ước số dương của \(n\) (trừ \(n\)).
b. Tính tổng của các ước số tìm được.
c. So sánh tổng này với chính số \(n\). Nếu bằng nhau thì \(n\) là số hoàn hảo, ngược lại thì không phải.
3. Tìm các ước số của một số
Làm thế nào để tìm các ước số của một số \(n\)? Một số \(i\) được gọi là ước của \(n\) nếu \(n\) chia hết cho \(i\) và \(i\) là số nguyên dương.
Trong lập trình, chúng ta có thể sử dụng toán tử chia lấy dư (\(%\)) để kiểm tra điều này. Nếu \(n % i == 0\) thì \(i\) là một ước của \(n\).
Chúng ta sẽ cần kiểm tra tất cả các số nguyên dương từ 1 cho đến \(n-1\) xem chúng có phải là ước của \(n\) hay không.
4. Viết chương trình C++
Bây giờ, chúng ta sẽ cùng nhau viết code C++ để thực hiện ý tưởng trên.
cpp
#include
int main() {
int n; // Khai báo biến n để lưu số cần kiểm tra
int tong_uoc = 0; // Khai báo biến tong_uoc để lưu tổng các ước số, khởi tạo bằng 0
// Bước 1: Yêu cầu người dùng nhập vào một số nguyên dương
std::cout << "Nhap mot so nguyen duong: ";
std::cin >> n;
// Bước 2: Tìm các ước số và tính tổng
// Chúng ta sẽ duyệt qua tất cả các số từ 1 đến n-1
// Sử dụng vòng lặp for
for (int i = 1; i < n; ++i) {
// Kiểm tra xem i có phải là ước của n không
if (n % i == 0) {
// Nếu i là ước, cộng nó vào biến tong_uoc
tong_uoc = tong_uoc + i;
}
}
// Bước 3: Kiểm tra xem số đó có phải là số hoàn hảo hay không
// So sánh tong_uoc với n
if (tong_uoc == n) {
// Nếu bằng nhau, in ra thông báo là số hoàn hảo
std::cout << n << " la mot so hoan hao." << std::endl;
} else {
// Nếu không bằng nhau, in ra thông báo là không phải số hoàn hảo
std::cout << n << " khong phai la so hoan hao." << std::endl;
}
return 0; // Kết thúc chương trình
}
5. Giải thích chi tiết từng phần của code
* \(#include
* \(int main() { … }\): Đây là hàm chính của chương trình, nơi mà mọi thứ bắt đầu chạy.
* \(int n;\): Khai báo một biến có tên là \(n\) với kiểu dữ liệu là \(int\) (số nguyên). Biến này sẽ được dùng để lưu trữ số mà người dùng nhập vào.
* \(int tong_uoc = 0;\): Khai báo một biến có tên là \(tong_uoc\) với kiểu dữ liệu là \(int\) và khởi tạo giá trị ban đầu là 0. Biến này sẽ dùng để tích lũy tổng của các ước số tìm được.
* \(std::cout << "Nhap mot so nguyen duong: ";\): Lệnh này sẽ hiển thị dòng chữ "Nhap mot so nguyen duong: " trên màn hình, yêu cầu người dùng nhập liệu. * \(std::cin >> n;\): Lệnh này sẽ đợi người dùng nhập một số nguyên từ bàn phím và lưu giá trị đó vào biến \(n\).
* \(for (int i = 1; i < n; ++i) { ... }\): Đây là một vòng lặp \(for\). * \(int i = 1;\): Khởi tạo biến đếm \(i\) với giá trị là 1. Chúng ta bắt đầu kiểm tra ước từ số 1. * \(i < n;\): Điều kiện để vòng lặp tiếp tục chạy. Vòng lặp sẽ chạy chừng nào \(i\) còn nhỏ hơn \(n\). Chúng ta chỉ cần kiểm tra các số nhỏ hơn \(n\) vì ước số dương của \(n\) (không bao gồm chính nó) sẽ không bao giờ lớn hơn hoặc bằng \(n\). * \(++i;\): Sau mỗi lần lặp, giá trị của \(i\) sẽ tăng lên 1. * \(if (n % i == 0) { ... }\): Bên trong vòng lặp, chúng ta sử dụng câu lệnh \(if\) để kiểm tra. * \(n % i\): Đây là phép toán chia lấy dư. Nó trả về phần dư khi \(n\) chia cho \(i\). * \(n % i == 0\): Điều kiện này sẽ đúng (true) nếu \(n\) chia hết cho \(i\) (tức là \(i\) là ước của \(n\)). * \(tong_uoc = tong_uoc + i;\): Nếu điều kiện \(n % i == 0\) là đúng, tức là \(i\) là một ước của \(n\), thì giá trị của \(i\) sẽ được cộng vào biến \(tong_uoc\). Dòng này có thể viết gọn là \(tong_uoc += i;\). * \(if (tong_uoc == n) { ... } else { ... }\): Sau khi vòng lặp kết thúc (tức là chúng ta đã kiểm tra hết tất cả các số từ 1 đến \(n-1\)), chúng ta sẽ thực hiện bước so sánh cuối cùng. * \(tong_uoc == n\): Kiểm tra xem tổng các ước số đã tính được có bằng với số \(n\) ban đầu hay không. * Nếu điều kiện đúng, \(std::cout << n << " la mot so hoan hao." << std::endl;\) sẽ được thực thi, thông báo rằng \(n\) là số hoàn hảo. * Nếu điều kiện sai, \(std::cout << n << " khong phai la so hoan hao." << std::endl;\) sẽ được thực thi, thông báo rằng \(n\) không phải là số hoàn hảo. * \(std::endl\): Lệnh này dùng để xuống dòng sau khi in. * \(return 0;\): Dòng này báo hiệu rằng chương trình đã kết thúc thành công. 6. Vài điểm cần lưu ý
* Chương trình này chỉ kiểm tra với số nguyên dương. Nếu các em muốn kiểm tra với số âm hoặc số 0, chúng ta cần thêm các điều kiện xử lý riêng.
* Đối với những số rất lớn, cách kiểm tra này có thể hơi chậm. Tuy nhiên, trong phạm vi kiến thức lớp 8, đây là cách tiếp cận hợp lý và dễ hiểu nhất.
Vậy là chúng ta đã cùng nhau tìm hiểu về số hoàn hảo và cách viết chương trình C++ để kiểm tra nó. Các em hãy thực hành code này trên máy tính của mình và thử với các số khác nhau nhé! Nếu có bất kỳ câu hỏi nào, đừng ngần ngại hỏi cô nhé. Chúc các em học tốt!
Giải thích các bước giải:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll TU(ll n)
{
int cnt=0;
for(ll i=1;i*i<n;i++)
{
if(!(n%i))
cnt+=i+n/i;
if(i*i==n)
cnt-=i;
}
return cnt;
}
int main()
{
ll n;
cin>>n;
if(TU(n)-n==n)
cout<<“YES”;
else
cout<<“NO”;
}
Thuật toán: Tạo 1 hàm tính tổng các ước của 1 số (Thuật toán duyệt căn, có thể tìm hiểu thêm). Sau đó trừ đi chính nó, vì chính số đó là ước lớn nhất của nó. Kiểm tra xem nó có bằng chính số đó hay không.
\(\texttt{C++}\)
#include <bits/stdc++.h>
using namespace std;
long long tonguoc(long long n)
{
int s = 0;
for(long long i = 1; i * i <= n; i++)
{
if(n%i==0)
{
s+=i;
if(n/i!=i) s+=n/i;
}
}
return s;
}
int main()
{
long long n;
cin>>n;
if(tonguoc(n)-n==n) cout<<“YES”;
else cout<<“NO”;
}