Bài tập C/C++ cho người mới

Kiểm tra số nguyên tố trong C, C++

Trong bài học này, bạn sẽ kiểm tra một số nguyên có phải là số nguyên tố hay không bằng cách thử các ước số đến căn bậc hai của nó.

Giới thiệu

Số nguyên tố là số lớn hơn 1 và chỉ chia hết cho 1 và chính nó. Để kiểm tra, ta thử chia số đó cho các số nhỏ hơn. Tuy nhiên, chỉ cần thử đến căn bậc hai của số đó là đủ, giúp chương trình chạy nhanh hơn rất nhiều.

Những điểm quan trọng

  • Luôn bật cảnh báo của trình biên dịch (compiler warning) và sửa hết các cảnh báo.
  • Hiểu rõ kiểu dữ liệu và thời gian tồn tại (lifetime) của từng giá trị.
  • Luôn kiểm tra dữ liệu đầu vào và giới hạn chỉ số của mảng.

Code ví dụ bằng C và C++

C
Chạy code →
main.c
#include <stdio.h>
int main(void) {
    int number = 29, prime = number > 1;
    // A composite number has a factor no larger than its square root.
    for (int divisor = 2; divisor * divisor <= number; ++divisor)
        if (number % divisor == 0) { prime = 0; break; }
    printf("%d is %sprime\n", number, prime ? "" : "not ");
}
Kết quả khi chạy
29 is prime
C++
Chạy code →
main.cpp
#include <iostream>
int main() {
    int number = 29;
    bool prime = number > 1;
    // Stop after the square root and on the first divisor.
    for (int divisor = 2; divisor * divisor <= number && prime; ++divisor)
        prime = number % divisor != 0;
    std::cout << number << " is " << (prime ? "" : "not ") << "prime\n";
}
Kết quả khi chạy
29 is prime

So sánh C và C++

Vòng lặp chỉ chạy khi divisor * divisor <= number, vì nếu số đó có một ước lớn hơn căn bậc hai thì nó phải đi kèm một ước nhỏ hơn đã được kiểm tra trước đó. Ngay khi tìm thấy một ước, phiên bản C dừng vòng lặp bằng break, còn phiên bản C++ dừng nhờ điều kiện && prime. Kết quả cho thấy 29 là số nguyên tố.

C

C dùng các hàm thủ tục gọn nhẹ và thể hiện rõ cách dữ liệu được biểu diễn trong bộ nhớ.

C++

C++ vẫn cho phép làm việc ở mức thấp nhưng bổ sung các kiểu dữ liệu thư viện và công cụ trừu tượng an toàn hơn.

Bài tập mở rộng

Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.

  • Thử nhập dữ liệu sai và các giá trị ở biên.
  • Biên dịch với các cờ -Wall -Wextra -Wpedantic để bật thêm cảnh báo.
  • Tách phần khai báo dùng chung ra file header và phần cài đặt ra file riêng.

Luyện tập với thử thách

Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.

Tất cả thử thách