LATEST

Thuật toán kiểm tra số hoàn hảo trong C / C++

Trong bài viết này, codehow sẽ giới thiệu đến cá bạn thuật toán kiểm tra số hoàn hảo trong C / C++. Đây chắn hẳn là một khái niệm mới đối với các bạn mới bắt đầu học lập trình.

Ở toán học phổ thông trước đây mình cũng chưa từng nghe qua khái niệm này. Tuy nhiên khi bắt đầu học lập trình thì mình ngày càng khai phá được nhiều khái niệm hay hơn. Vậy hãy bắt đầu tìm hiểu cùng mình thôi nhé.

Số hoàn hảo là gì?

Số hoàn hảo là số có tổng các ước số của nó bằng chính nó.

Nếu khái niệm hơi khó hiểu, các bạn có thể xem ví dụ dưới đây để hiểu rõ hơn nhé.

Ví dụ: Mình có số 6 là số hoàn hảo, bởi vì 6 có 3 ước số là 1, 2 , 3. Vậy tổng các ước số là 1 + 2 + 3 = 6 (bằng chính nó).

Ví dụ: Số 10 không phải là số hoàn hảo vì ước của 10 là 1, 2, 5. Tổng của nó là 8 chứ không phải 10.

Công thức:

Np = 2(p - 1) (2p - 1)

Một số tính chất đặc biệt của số hoàn hảo:

  • Là các số chẵn.
  • Có 4 số hoàn hảo đầu tiên là: 6, 28, 496, 8128.

Đến nay vẫn chưa có nghiên cứu nào chứng minh rằng số hoàn hảo là một dãy số vô hạn.

Thuật toán kiểm tra số hoàn hảo trong C / C++

Dưới đây là thuật toán kiểm tra số hoàn hảo trong C / C++, các bạn hãy cùng xem qua thuật toán rồi mình sẽ giải thích ngay bên dưới nhé.

bool check(int a){
    int sum = 0;//khai báo biến sum
    for(int i=1;i<=a/2;i++){ //tạo vòng lặp for để tìm ước số của a
        if(a%i==0) 
            sum+=i; //tổng các ước số của a
    }
    if(sum==a) return true; // trả về true
    return false; // ngược lại trả về false
}

Giải thích thuật toán:

  1. Khai báo biến sum = 0, đây là biến để lưu tổng các ước số của số cần kiểm tra.
  2. Sử dụng vòng lặp for lặp từ 1 đến a / 2 để tìm ra ước số của a. (vì ước của một số luôn nhỏ hơn nửa số đó, vậy nên điểm dừng vòng lặp là a / 2).
  3. Mỗi lần tìm thấy ước số của a, ta cộng dồn vào biến sum.
  4. Kiểm tra nếu sum = a (bằng chính nó) thì kết luận đây là số hoàn hảo. Ngược lại thì không phải số hoàn hảo.

Nếu các bạn không sử dụng vòng lặp for, thì có thể sử dụng vòng lặp while để thay thế nhé.

bool check(int a){
    int sum = 0, i = 1;//khai báo biến sum
    while(i<=a/2){ //tạo vòng lặp while để tìm ước số của a
        if(a%i==0) 
            sum+=i; //tổng các ước số của a
            i++; // bước nhảy của vòng lặp while
    }
    if(sum==a) return true; // trả về true
    return false; // ngược lại trả về false
}

Ví dụ thuật toán kiểm tra số hoàn hảo trong C / C++

Dựa vào thuật toán kiểm tra số hoàn hảo ở trêm, mình sẽ thực hiện một chương trình kiểm tra số hoàn hảo do người dùng nhập vào. Chương trình sẽ được viết bằng hai ngôn ngữ khác nhau là C và C++, các bạn có thể tham khảo nhé.

Chương trình C:

#include <stdio.h>
#include <stdbool.h>
bool check(int a){
    int sum = 0;//khai báo biến sum
    for(int i=1;i<=a/2;i++){ //tạo vòng lặp for để tìm ước số của a
        if(a%i==0) 
            sum+=i; //tổng các ước số của a
    }
    if(sum==a) return true; // trả về true
    return false; // ngược lại trả về false
}

int main(void) {
  int n;
    printf("Nhập vào số cần kiểm tra: ");
    scanf("%d", &n);
    if (check(n)){
        printf("%d là số hoàn hảo.",n);
    }
    else {
        printf("%d không phải là số hoàn hảo.",n);
    }

  printf("\n----------------------------------\n");
  printf("Chương trình này được đăng tại codehow.net");
  return 0;
}

Kết quả:

bai3 02 PNG

Chương trình C++:

#include <iostream>
using namespace std;

bool check(int a){
    int sum = 0;//khai báo biến sum
    for(int i=1;i<=a/2;i++){ //tạo vòng lặp for để tìm ước số của a
        if(a%i==0) 
            sum+=i; //tổng các ước số của a
    }
    if(sum==a) return true; // trả về true
    return false; // ngược lại trả về false
}

int main() {
  int n;
    cout << "Nhập vào số cần kiểm tra: ";
    cin >> n;
    if (check(n)){
        cout <<n<< " là số hoàn hảo.";
    }
    else {
        cout <<n<< " không phải là số hoàn hảo";
    }

  cout<<"\n----------------------------------\n";
  cout<<"Chương trình này được đăng tại codehow.net";
  return 0;
}

Kết quả:

bai3 01 PNG

Như vậy là chúng ta đã cùng nhau tìm hiểu về thuật toán kiểm tra số hoàn hảo trong C / C++. Hãy luyện tập thật nhiều để nâng cao tư duy logic và sử dụng các thuật toán một cách thành thạo nhé. Chúc các bạn thành công !!!

Cùng chuyên mục:

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Sử dụng đệ quy để giải bài toán tháp Hà Nội

Sử dụng đệ quy để giải bài toán tháp Hà Nội

Đệ quy tương hỗ (Mutual Recursion) trong C / C++

Đệ quy tương hỗ (Mutual Recursion) trong C / C++

Đệ quy lồng (Nested Recursion) trong C / C++

Đệ quy lồng (Nested Recursion) trong C / C++

Đệ quy đa tuyến (Exponential Recursion) trong C / C++

Đệ quy đa tuyến (Exponential Recursion) trong C / C++

Đệ quy nhị phân (Binary Recursion) trong C / C++

Đệ quy nhị phân (Binary Recursion) trong C / C++

Đệ quy đuôi (Tail Recursion) trong C / C++

Đệ quy đuôi (Tail Recursion) trong C / C++

Đệ quy tuyến tính (Linear Recursion) trong C / C++

Đệ quy tuyến tính (Linear Recursion) trong C / C++

Hàm đệ quy là gì? Các loại hàm đệ quy trong C / C++

Hàm đệ quy là gì? Các loại hàm đệ quy trong C / C++

Thuật toán sắp xếp Quick Sort trong C / C++

Thuật toán sắp xếp Quick Sort trong C / C++

Thuật toán sắp xếp trộn (Merge Sort) trong C / C++

Thuật toán sắp xếp trộn (Merge Sort) trong C / C++

Thuật toán sắp xếp chọn (Selection Sort) trong C / C++

Thuật toán sắp xếp chọn (Selection Sort) trong C / C++

Thuật toán sắp xếp chèn (Insertion Sort) trong C / C++

Thuật toán sắp xếp chèn (Insertion Sort) trong C / C++

Thuật toán sắp xếp nổi bọt (Bubble Sort) trong C / C++

Thuật toán sắp xếp nổi bọt (Bubble Sort) trong C / C++

Thuật toán tìm kiếm nội suy (Interpolation Search) trong C / C++

Thuật toán tìm kiếm nội suy (Interpolation Search) trong C / C++

Thuật toán tìm kiếm nhị phần (Binary Search) trong C / C++

Thuật toán tìm kiếm nhị phần (Binary Search) trong C / C++

Thuật toán tìm kiếm tuyến tính (Linear Search) trong C / C++

Thuật toán tìm kiếm tuyến tính (Linear Search) trong C / C++

Thuật toán kiểm tra năm nhuận trong C / C++

Thuật toán kiểm tra năm nhuận trong C / C++

Thuật toán kiểm tra số chẵn lẻ trong C / C++

Thuật toán kiểm tra số chẵn lẻ trong C / C++

Thuật toán tính lũy thừa trong C / C++

Thuật toán tính lũy thừa trong C / C++

Top