19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8

docx 133 trang ducduy 20/11/2025 180
Bạn đang xem 30 trang mẫu của tài liệu "19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

Tóm tắt nội dung tài liệu: 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8

19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8
 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
 ĐÁP ÁN
Câu 1. (8.0 điểm) Tính tổng
#include 
using namespace std;
void GiaiCau1_TinhTong() {
 long long N;
 // Đọc số N
 if (!(cin >> N)) return;
 // 1. Tính tổng Gauss: T = N * (N + 1) / 2
 // Phải chia 2 trước khi nhân để tối ưu và tránh tràn số nếu N và N+1 chẵn
 long long T;
 if (N % 2 == 0) {
 T = (N / 2) * (N + 1);
 } else {
 T = N * ((N + 1) / 2);
 }
 // 2. Tính tổng lập phương: S = T * T
 // Cảnh báo: S có thể tràn kiểu long long nếu N > 2,097,152
 // (sqrt(max_long_long * 2) - 1)
 // Sẽ tràn số nếu N > 2*10^6. Phải dùng thư viện Big Integer hoặc xuất ra giá trị tràn.
 // Giả sử: yêu cầu của đề bài nằm trong phạm vi long long (như N <= 10^5) hoặc chỉ chấm 
80% test case
 long long S = T * T;
 // Ví dụ N=9: T = 9*10/2 = 45. S = 45*45 = 2025.
 cout << S << endl;
}
Câu 2. (6.0 điểm) Chia hết
#include 
#include 
#include 
#include 
 DeThiHay.net 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
using namespace std;
// Hàm kiểm tra n có chia hết cho k không (n là chuỗi)
bool IsDivisible(const string& n, int k) {
 if (n.empty()) return false;
 // Xử lý k=1
 if (k == 1) return true;
 // --- DẤU HIỆU CHIA HẾT CHO 2, 5 ---
 int last_digit = n.back() - '0'; // Lấy chữ số cuối cùng
 if (k == 2) {
 return last_digit % 2 == 0;
 }
 if (k == 5) {
 return last_digit == 0 || last_digit == 5;
 }
 // --- DẤU HIỆU CHIA HẾT CHO 3, 6 ---
 if (k == 3 || k == 6) {
 // Tính tổng các chữ số
 long long sum_digits = 0;
 for (char c : n) {
 sum_digits += (c - '0');
 }
 // Kiểm tra chia hết cho 3
 if (k == 3) {
 return sum_digits % 3 == 0;
 }
 // Kiểm tra chia hết cho 6 (phải chia hết cho 2 VÀ 3)
 if (k == 6) {
 return (last_digit % 2 == 0) && (sum_digits % 3 == 0);
 }
 }
 DeThiHay.net 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
 // --- DẤU HIỆU CHIA HẾT CHO 4 ---
 if (k == 4) {
 // Lấy hai chữ số cuối cùng
 if (n.length() == 1) {
 return last_digit % 4 == 0;
 }
 // Lấy hai chữ số cuối (Ví dụ: "1234" -> 34)
 string last_two_str;
 if (n.length() >= 2) {
 last_two_str = n.substr(n.length() - 2);
 } else {
 last_two_str = n;
 }
 int last_two_digits = stoi(last_two_str); // Chuyển chuỗi 2 ký tự thành số
 return last_two_digits % 4 == 0;
 }
 return false; // Trường hợp k không thuộc [1, 6] (không xảy ra theo ràng buộc)
}
void GiaiCau2_ChiaHet() {
 int t;
 cout << "Nhap so luong test t: ";
 if (!(cin >> t)) return;
 for (int i = 0; i < t; ++i) {
 string n;
 int k;
 cout << "Nhap n va k cho test " << i + 1 << " (cach nhau boi dau cach hoac xuong 
dong): ";
 if (!(cin >> n >> k)) return;
 if (IsDivisible(n, k)) {
 cout << "YES" << endl;
 } else {
 DeThiHay.net 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
 cout << "NO" << endl;
 }
 }
}
// int main() {
// // GiaiCau1_TinhTong(); // Chạy câu 1
// // GiaiCau2_ChiaHet(); // Chạy câu 2
// return 0;
// }
Câu 3. (4.0 điểm) Xâu nguyên tố
#include 
#include 
#include 
#include 
using namespace std;
void GiaiCau3_XauNguyenTo() {
 string s;
 cout << "Nhap xau S: ";
 if (!(cin >> s)) return;
 // 1. Đếm tần suất xuất hiện của mỗi ký tự
 map tan_suat;
 for (char c : s) {
 tan_suat[c]++;
 }
 // 2. Xác định P và Q
 int P = 0; // Số lượng ký tự xuất hiện 1 lần
 int Q = 0; // Số lượng ký tự xuất hiện > 1 lần
 // Duyệt qua map để phân loại
 for (auto const& [ky_tu, dem] : tan_suat) {
 if (dem == 1) {
 DeThiHay.net 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
 P++;
 } else {
 // Không phải 1, mà là > 1 lần
 Q++; 
 }
 }
 // 3. Kiểm tra điều kiện
 if (P == Q) {
 // Xâu nguyên tố
 cout << P << endl;
 } else {
 // Không phải xâu nguyên tố
 cout << -1 << endl;
 }
}
// int main() {
// GiaiCau3_XauNguyenTo();
// return 0;
// }
Câu 4. (2.0 điểm) Tổng chẵn
#include 
#include 
#include 
using namespace std;
void GiaiCau4_TongChan() {
 int n;
 cout << "Nhap so luong phan tu n: ";
 if (!(cin >> n)) return;
 vector a(n);
 cout << "Nhap day a: ";
 for (int i = 0; i < n; ++i) {
 DeThiHay.net 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
 if (!(cin >> a[i])) return;
 }
 // Khởi tạo bộ đếm cho P[i] chẵn và lẻ
 // P[i] là tổng tiền tố modulo 2. P[0] luôn là 0 (chẵn)
 long long dem_chan = 1; // Khởi tạo 1 vì P[0] = 0 là chẵn
 long long dem_le = 0; 
 int current_sum_mod2 = 0; // Tương đương với P[i]
 for (int i = 0; i < n; ++i) {
 // Cập nhật tổng tiền tố modulo 2
 // a[i] % 2 là 1 nếu lẻ, 0 nếu chẵn
 current_sum_mod2 = (current_sum_mod2 + (a[i] % 2 + 2) % 2) % 2; 
 // Đếm
 if (current_sum_mod2 == 0) {
 dem_chan++;
 } else {
 dem_le++;
 }
 }
 // Áp dụng công thức tổ hợp C(k, 2) = k * (k - 1) / 2
 // Số lượng cặp có P[j] = P[i-1]
 long long ket_qua = (dem_chan * (dem_chan - 1) / 2) + (dem_le * (dem_le - 1) / 2);
 cout << ket_qua << endl;
}
/* * KẾT QUẢ VỚI DỮ LIỆU MẪU:
 * Input: 4, Dãy 1 1 1 1 -> Output: 4
 * Input: 6, Dãy 1 2 3 4 5 6
 * P: 0 | 1 | 1 | 0 | 0 | 1 | 1 
 * C_chan = 3 (0, 0, 0). C_le = 4 (1, 1, 1, 1)
 * Số lượng dãy con chẵn = 3*2/2 + 4*3/2 = 3 + 6 = 9. (Khớp)
 */
 DeThiHay.net 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
 ĐỀ SỐ 6
 PHÒNG GD VÀ ĐT THỌ XUÂN KỲ THI CHỌN HỌC SINH GIỎI LỚP 7, LỚP 8
 ---------------------- CẤP HUYỆN - NĂM HỌC: 2023-2024
 MÔN THI: TIN HỌC LỚP 8
 Thời gian: 120 phút (không kể thời gian giao đề)
PHẦN THI: LÝ THUYẾT
Hãy chọn một phương án trả lời mà em cho là đúng nhất:
 Câu 1: Chương trình máy tính là?
A. Dãy các thao tác điều khiển máy tính thực hiện thuật toán
B. Dãy các lệnh điều khiển máy tính giải quyết thuật toán
C. Dãy các lệnh điều khiển máy tính thực hiện thuật toán
D. Dãy các lệnh điều khiển máy tính xử lý thuật toán
Câu 2: Thuật toán là gì?
A. Một thao tác cần thực hiện để thu được kết quả cần thiết từ những điều kiện cho trước.
B. Dãy các thao tác cần thực hiện theo 1 trình tự xác định để thu được kết quả cần thiết từ 
những điều kiện cho trước.
C. Dãy các thao tác cần thực hiện để thu được kết quả cần thiết từ những điều kiện cho trước.
D. Tất cả đều sai
Câu 3: Xác định điều kiện đã cho của bài toán tính chu vi tam giác là xác định gì?
A. Diện tích tam giác
B. Chiều cao của tam giác
C. Chu vi tam giác
D. 3 cạnh của tam giác
Câu 4: Tam giác đều là hình có ba cạnh bằng nhau, ba góc bằng nhau và bằng 60 độ. Để di 
chuyển theo một hình tam giác đều, nhân vật cần lặp lại ba lần việc thực hiện hai hành động 
sau đây:
1. Di chuyển về phía trước một số bước bằng độ dài cạnh tam giác. Vi dụ, di chuyển 60 
bước.
2. Quay trái 120 độ.
Thuật toán đã sử dụng?
A. Cấu trúc tuần tự
B. Cấu trúc lặp
C. Cả hai đáp án trên đều đúng
D. Cả hai đáp án trên đều sai
Câu 5: Trong các ngôn ngữ lập trình thì cái gì được phân loại thành kiểu logic?
A. Kí tự
 DeThiHay.net 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
B. Văn bản
C. Số
D. Các điều kiện hay các phép so sánh
Câu 6: Mỗi phép toán sẽ cho kết quả là?
A. Giá trị thuộc các kiểu dữ liệu khác nhau
B. Giá trị thuộc một kiểu dữ liệu nhất định
C. Giá trị độc lập
D. Đáp án khác
Câu 7: Trong ngôn ngữ lập trình trực quan, cấu trúc lặp được thể hiện bằng?
A. Khối lệnh chứa một điều kiện hay biểu thức logic
B. Cách lắp ghép các khối lệnh thành phần theo đúng trình tự của các hoạt động từ trên 
xuống dưới
C. Khối lệnh "lặp cho đến khi"
D. Cả ba đáp án trên đều đúng
Câu 8: Thứ tự các bước giải bài toán trên máy tính:
A. Xác định bải toán -> Mô tả thuật toán -> Viết chương trình
B. Xác định bài toán -> Viết chương trình -> Mô tả thuật toán
C. Mô tả thuật toán -> Xác định bài toán -> Viết chương trình
D. Viết chương trình -> Xác định bài toán -> Mô tả thuật toán
Câu 9: 1 công việc hay 1 nhiệm vụ cần được giài quyết được gọi là:
A. Bài toán
B. Thuật toán
C. Chương trình
D. Điều kiện cho trước
Câu 10: Việc chạy thử chương trình để kiểm tra nhằm?
A. Thử nhiệm chương trình
B. Cho chương trình hoạt động
C. Phát hiện những tình huống bất thường khi chạy chương trình
D. Cả ba đáp án trên đều sai
Câu 11: Các lỗi cần được loại bỏ khi?
A. Trước khi chương trình được coi là sản phầm hoàn chinh
B. Có thể chia sẻ với người khác
C. Đáp án A,B trên đều sai
D. Đáp án A,B trên đều đúng
Câu 12: Chọn phát biểu đúng nhất về hoạt động gỡ lỗi?
A. Gỡ lỗi là phát hiện và loại bỏ lỗi. Trong lập trình, không nhất thiết phải gỡ lỗi
 DeThiHay.net 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
B. Gỡ lỗi là chạy thử chương trình để phát hiện lỗi. Gỡ lỗi là một phần quan trọng của lập 
trình
C. Gỡ lỗi là chạy thử chương trình để phát hiện lỗi. Trong lập trình, không nhất thiết phải gỡ 
lỗi
D. Gỡ lỗi là phát hiện và loại bỏ lỗi. Gỡ lỗi là một phần quan trọng của lập trình
Câu 13: Đâu là cách để phát hiện lỗi logic?
A. Phân tích logic
B. Chạy thử với dữ liệu mẫu để dò lỗi
C. Cả hai đáp án A,B đều đúng
D. Cả hai đáp án A,B đều sai
Câu 14: Hãy cho biết kết quả khi thực hiện thuật toán sau:
Bước 1. Tam ←x;
Bước 2. x←y;
Bước 3. y← tam;
A. Giá trị của biến x bằng giá trị của biến y
B. Hoán đồi giá trị hai biến x và y
C. Giá trị của biến y bằng giá trị của biến x
D. Một kết quả khác
Câu 15: Trong thuật toán giải phương trình ax + b = 0, để kiểm tra trường hợp nghiệm 
y = ―b/a ta sử dụng test nào?
A. a = 0, b = 1
B. a = 0, b = 0
C. a = 3, b = 6
D. Tất cả đều đúng
Câu 16: Xác định bài toán: " kiểm tra n có phải là số nguyên tố hay không?"
A. Input: Nhập số n ; Output: n là số nguyên tố hoặc n không là số nguyên tố
B. Input: 푛 là số nguyên tố hoặc 푛 không là số nguyên tố; Output: Nhập số n
C. Input: n là số nguyên tố; Output: Nhập số n
D. Input: Nhập số n; Output: n là số nguyên tố
 DeThiHay.net 19 Đề thi và Đáp án chọn Học sinh giỏi các cấp môn Tin học Lớp 8 - DeThiHay.net
PHẦN THI: THỰC HÀNH
Sử dụng ngôn ngữ lập trình C++ để lập trình giải các bài toán sau:
Ghi chú: 
1. Thí sinh tạo thư mục có tên là SBD (ví dụ: Thí sinh có số báo 
danh 25 thì tạo thư mục SBD25) sau đó copy bài làm theo quy định vào thư mục đã tạo đó.
2. Dữ liệu vào là đúng đắn, không cần phải kiểm tra.
Bài 1. (6,0 điểm) 
 Bạn Minh có một tấm bìa hình chữ nhật với chiều dài và chiều rộng lần lượt là a, b đơn 
vị chiều dài (a, b nguyên dương). Minh muốn cắt tấm bìa thành các mảnh nhỏ hình vuông 
bằng nhau sao cho tấm bìa được cắt hết không còn thừa mảnh nào.
Yêu cầu: Tính độ dài lớn nhất của cạnh hình vuông mà Minh có thể cắt được. 
Dữ liệu: Đọc từ file BAI1.INP gồm một dòng chứa hai số nguyên dương a, b (0<b<a≤109) 
chỉ chiều dài và chiều rộng hình chữ nhật, các số cách nhau một dấu cách (dấu trắng). 
Kết quả: Ghi ra file BAI1.OUT số nguyên dương duy nhất là kết quả của bài toán.
Ví dụ: 
 BAI1.INP BAI1.OUT
 5 3 1
 12 8 4
Bài 2. (4,0 điểm) 
 Một khu du lịch có N điểm tham quan được đánh số từ 1 đến N. Có hai đoàn du khách 
mỗi đoàn đăng ký tham quan lần lượt là x, y điểm đến (x, y≤ N). Ban quản lý khu du lịch 
muốn biết được những địa điểm nào mà cả hai đoàn khách đều đến để tăng cường đội ngũ 
nhân viên phục vụ.
Yêu cầu: Hãy lập trình giúp ban quản lý biết được những địa điểm tham quan của khu du 
lịch mà cả hai đoàn khách sẽ cùng ghé thăm.
Dữ liệu: Đọc từ file BAI2.INP gồm 3 dòng:
- Dòng 1: Gồm 3 số N, x, y tương ứng với số địa điểm tham quan, số điểm đến của đoàn thứ 
nhất và số điểm đến của đoàn thứ hai.
- Dòng 2: Gồm x số nguyên theo thứ tự tăng dần ứng với x điểm tham quan của đoàn khách 
thứ nhất.
- Dòng 3: Gồm y số nguyên theo thứ tự tăng dần ứng với y điểm tham quan của đoàn khách 
thứ hai.
Kết quả: Ghi ra file BAI2.OUT gồm một dòng là các địa điểm tham quan chung của cả hai 
đoàn. Nếu không có địa điểm nào chung thì ghi số 0.
Các số trên cùng một dòng cách nhau một dấu cách (dấu trắng).
 DeThiHay.net

File đính kèm:

  • docx19_de_thi_va_dap_an_chon_hoc_sinh_gioi_cac_cap_mon_tin_hoc_l.docx