Câu 1: Số nguyên tố lớn hơn (4 điểm) Tên tập tin chương trình: PRIMEMORE.??? Trong một thuật toán mã hóa, người ta thường dùng 2 số nguyên tố để làm khóa mã hóa và khóa giải mã. Khi gửi tài liệu đã được mã hóa, khóa giải mã sẽ được gửi kèm theo. Để tránh bị lộ, người ta chỉ gửi một số nguyên dương N khá lớn và quy ước rằng khóa giải mã X sẽ là số nguyên tố nhỏ nhất và lớn hơn N. Yêu cầu: viết chương trình tìm khóa giải mã X. Dữ liệu: vào từ tập tin văn bản PRIMEMORE.INP số nguyên dương N (N ≤ 1012). Kết quả: đưa ra tập tin văn bản PRIMEMORE.OUT giá trị của khóa giải mã X tìm được. Tên tập tin chương trình: MULTIPLE.??? Trong môn Tin học đại cương, Nam đã học về thuật toán Euclid tìm ước số chung lớn nhất (USCLN) của 2 số tự nhiên A, B không đồng thời bằng 0 và cách tính bội số chung nhỏ nhất (BSCNN) dựa vào USCLN theo công thức: ( , ) ( , ) USCLN A B A B BSCNN A B = Đến buổi thực hành, Nam cần viết một chương trình về vấn đề đã học. Yêu cầu: tìm BSCNN(A, B). Dữ liệu: vào từ tập tin văn bản MULTIPLE.INP 2 số tự nhiên A, B không đồng thời bằng 0 (A, B ≤ 109). Kết quả: đưa ra tập tin văn bản MULTIPLE.OUT giá trị của BSCNN(A, B). Câu 3: Số dư khi chia cho 13 (2 điểm) Tên tập tin chương trình: REMAIN13.??? Để tìm số dư khi chia một số nguyên dương N (không quá lớn) cho 13, người ta có thể dùng cách chia trực tiếp. Tuy nhiên, với các số nguyên dương rất lớn, có thể lên tới hàng trăm chữ số, cách chia trực tiếp là không hợp lý. Khi đó, người ta sử dụng quy tắc đồng dư theo cách nhóm từng bộ 6 chữ số như sau: Ví dụ: với N = 45100001100002100003 Số dư khi chia N cho 13 = (Số dư khi chia 45 cho 13) + (Số dư khi chia 100001 cho 13) + (Số dư khi chia 100002 cho 13) + (Số dư khi chia 100003 cho 13) = Số dư khi chia (6 + 5 + 6 + 7) cho 13 = 11 Yêu cầu: viết chương trình tìm số dư của N khi chia cho 13 theo quy tắc đồng dư trên. Dữ liệu: vào từ tập tin văn bản REMAIN13.INP số nguyên dương N (N ≤ 10200). Kết quả: đưa ra tập tin văn bản REMAIN13.OUT số dư khi chia N cho 13.
Trang 1PHÊ DUYỆT
CHỦ NHIỆM KHOA
Đại tá, ThS Nguyễn Văn Khiêm
KHOA CÔNG NGHỆ THÔNG TIN
Kỳ thi: Học viên sinh viên giỏi môn Tin học Đối tượng: Cao đẳng và Đại học Không chuyên tin Hình thức: Thực hành
Thời gian: 120 phút
ĐỀ SỐ 01 Câu 1: Số nguyên tố lớn hơn (4 điểm)
Tên tập tin chương trình: PRIMEMORE.???
Trong một thuật toán mã hóa, người ta thường dùng 2 số nguyên tố để làm khóa mã hóa và khóa giải mã Khi gửi tài liệu đã được mã hóa, khóa giải mã sẽ được gửi kèm theo
Để tránh bị lộ, người ta chỉ gửi một số nguyên dương N khá lớn và quy ước rằng khóa giải
mã X sẽ là số nguyên tố nhỏ nhất và lớn hơn N
Yêu cầu: viết chương trình tìm khóa giải mã X
Dữ liệu: vào từ tập tin văn bản PRIMEMORE.INP số nguyên dương N (N ≤ 1012) Kết quả: đưa ra tập tin văn bản PRIMEMORE.OUT giá trị của khóa giải mã X tìm được
Ví dụ:
Câu 2: Bội số chung nhỏ nhất (4 điểm)
Tên tập tin chương trình: MULTIPLE.???
Trong môn Tin học đại cương, Nam đã học về thuật toán Euclid tìm ước số chung lớn nhất (USCLN) của 2 số tự nhiên A, B không đồng thời bằng 0 và cách tính bội số chung nhỏ nhất (BSCNN) dựa vào USCLN theo công thức:
) , (
* )
, (
B A USCLN
B A B
A
Đến buổi thực hành, Nam cần viết một chương trình về vấn đề đã học
Yêu cầu: tìm BSCNN(A, B)
Dữ liệu: vào từ tập tin văn bản MULTIPLE.INP 2 số tự nhiên A, B không đồng thời bằng 0 (A, B ≤ 109)
Kết quả: đưa ra tập tin văn bản MULTIPLE.OUT giá trị của BSCNN(A, B)
Ví dụ:
20334
35432
360237144
Câu 3: Số dư khi chia cho 13 (2 điểm)
Tên tập tin chương trình: REMAIN13.???
Để tìm số dư khi chia một số nguyên dương N (không quá lớn) cho 13, người ta có thể
dùng cách chia trực tiếp Tuy nhiên, với các số nguyên dương rất lớn, có thể lên tới hàng trăm chữ số, cách chia trực tiếp là không hợp lý Khi đó, người ta sử dụng quy tắc đồng dư theo cách nhóm từng bộ 6 chữ số như sau:
Ví dụ: với N = 45100001100002100003
Số dư khi chia N cho 13 = (Số dư khi chia 45 cho 13)
+ (Số dư khi chia 100001 cho 13)
Trang 2+ (Số dư khi chia 100002 cho 13) + (Số dư khi chia 100003 cho 13)
= Số dư khi chia (6 + 5 + 6 + 7) cho 13
= 11 Yêu cầu: viết chương trình tìm số dư của N khi chia cho 13 theo quy tắc đồng dư trên
Dữ liệu: vào từ tập tin văn bản REMAIN13.INP số nguyên dương N (N ≤ 10200) Kết quả: đưa ra tập tin văn bản REMAIN13.OUT số dư khi chia N cho 13
Ví dụ:
45100001100002100003 11
Học viên - sinh viên không được sử dụng tài liệu
Trang 3PHÊ DUYỆT
CHỦ NHIỆM KHOA
Đại tá, ThS Nguyễn Văn Khiêm
KHOA CÔNG NGHỆ THÔNG TIN
Kỳ thi: Học viên sinh viên giỏi môn Tin học Đối tượng: Cao đẳng và Đại học Không chuyên tin Hình thức: Thực hành
Thời gian: 120 phút
ĐỀ SỐ 02 Câu 1: Số nguyên tố nhỏ hơn (4 điểm)
Tên tập tin chương trình: PRIMELESS.???
Trong một thuật toán mã hóa, người ta thường dùng 2 số nguyên tố để làm khóa mã hóa và khóa giải mã Khi gửi tài liệu đã được mã hóa, khóa giải mã sẽ được gửi kèm theo
Để tránh bị lộ, người ta chỉ gửi một số nguyên dương N (có thể khá lớn) và quy ước rằng
khóa giải mã X sẽ là số nguyên tố lớn nhất và nhỏ hơn N
Yêu cầu: viết chương trình tìm khóa giải mã X
Dữ liệu: vào từ tập tin văn bản PRIMELESS.INP số nguyên dương N (2 < N ≤ 1012) Kết quả: đưa ra tập tin văn bản PRIMELESS.OUT giá trị của khóa giải mã X tìm được
Ví dụ:
Câu 2: Minh họa thuật toán Euclid (4 điểm)
Tên tập tin chương trình: EUCLID.???
Trong môn Tin học đại cương, Nam đã học về thuật toán Euclid tìm ước số chung lớn nhất (USCLN) của 2 số tự nhiên A, B không đồng thời bằng 0 theo mô tả đệ quy:
• USCLN(A, 0) = A
• USCLN(A, B) = USCLN(B, A mod B) nếu B khác 0
Trong đó: A mod B là số dư khi chia A cho B
Để giúp các bạn cùng lớp hiểu rõ hơn về thuật toán Euclid, đến buổi thực hành, Nam quyết định viết một chương trình minh họa quá trình thực hiện của thuật toán đã học
Yêu cầu: minh họa quá trình thực hiện của thuật toán Euclid
Dữ liệu: vào từ tập tin văn bản EUCLID.INP 2 số tự nhiên A, B không đồng thời bằng
0 (A, B ≤ 109)
Kết quả: đưa ra tập tin văn bản EUCLID.OUT, gồm nhiều dòng:
- Dòng 1: USCLN(A, B), với A, B là các giá trị ban đầu
- Các dòng tiếp theo: = USCLN(B, A mod B), với B, A mod B là các giá trị trung gian
ở bước minh họa kế tiếp
- Dòng cuối cùng: = <giá trị của USCLN(A, B)>
Ví dụ:
123
132
USCLN(123, 132)
= USCLN(132, 123)
= USCLN(123, 9)
= USCLN(9, 6)
= USCLN(6, 3)
= USCLN(3, 0)
= 3
Trang 4Câu 3: Số dư khi chia cho 11 (2 điểm)
Tên tập tin chương trình: REMAIN11.???
Để tìm số dư khi chia một số nguyên dương N (không quá lớn) cho 11, người ta có thể
dùng cách chia trực tiếp Tuy nhiên, với các số nguyên dương rất lớn, có thể lên tới hàng trăm chữ số, cách chia trực tiếp là không hợp lý Khi đó, người ta sử dụng quy tắc đồng dư theo cách nhóm từng bộ 6 chữ số như sau:
Ví dụ: với N = 45100001100002100003
Số dư khi chia N cho 11 = (Số dư khi chia 45 cho 11)
+ (Số dư khi chia 100001 cho 11) + (Số dư khi chia 100002 cho 11) + (Số dư khi chia 100003 cho 11)
= Số dư khi chia (1 + 0 + 1 + 2) cho 11
= 4 Yêu cầu: viết chương trình tìm số dư của N khi chia cho 11 theo quy tắc đồng dư trên
Dữ liệu: vào từ tập tin văn bản REMAIN11.INP số nguyên dương N (N ≤ 10200)
Kết quả: đưa ra tập tin văn bản REMAIN11.OUT số dư khi chia N cho 11
Ví dụ:
45100001100002100003 4
Học viên - sinh viên không được sử dụng tài liệu
Trang 5PHÊ DUYỆT
CHỦ NHIỆM KHOA
Đại tá, ThS Nguyễn Văn Khiêm
KHOA CÔNG NGHỆ THÔNG TIN
Kỳ thi: Học viên sinh viên giỏi môn Tin học Đối tượng: Đại học Chuyên tin
Hình thức: Thực hành Thời gian: 120 phút
ĐỀ SỐ 01 Câu 1: Số dư khi chia cho 3 (4 điểm)
Tên tập tin chương trình: REMAIN3.???
Để tìm số dư khi chia một số nguyên dương N (không quá lớn) cho 3, người ta có thể
dùng cách chia trực tiếp Tuy nhiên, với các số nguyên dương rất lớn, có thể lên tới hàng trăm chữ số, cách chia trực tiếp là không hợp lý Khi đó quy tắc đồng dư sau đây sẽ được sử dụng: "Số dư của một số N khi chia cho 3 = số dư của X khi chia cho 3 với X là tổng các chữ số của N"
Ví dụ: với N = 11234567800000, tổng các chữ số của N là:
X = 1+1+2+3+4+5+6+7+8+0+0+0+0+0 = 37
Số dư khi chia N cho 3 = Số dư khi chia 37 cho 3 = 1
Yêu cầu: viết chương trình tìm số dư của N khi chia cho 3 theo quy tắc đồng dư trên
Dữ liệu: vào từ tập tin văn bản REMAIN3.INP số nguyên dương N (N ≤ 10200)
Kết quả: đưa ra tập tin văn bản REMAIN3.OUT số dư khi chia N cho 3
Ví dụ:
Câu 2: Bản đồ mật độ mìn (4 điểm)
Tên tập tin chương trình: MINESMAP.???
Trong trò chơi dò mìn Minesweeper, bản đồ mìn là một hình chữ nhật gồm nhiều ô vuông nhỏ, trong đó ô có giá trị 1 là ô có mìn, ô có giá trị 0 là ô không có mìn Từ một bản
đồ mìn cho trước, bản đồ mật độ mìn sẽ được tạo ra, trong đó ô có giá trị * là ô có mìn, ô có giá trị là một số X từ 0 đến 8 là ô không có mìn nhưng có X ô có mìn kề với ô đó
Với bài tập lớn là xây dựng trò chơi dò mìn Minesweeper, Nam cần viết một chương trình tạo ra bản đồ mật độ mìn từ một bản đồ mìn cho trước
Yêu cầu: tìm bản đồ mật độ mìn
Dữ liệu: vào từ tập tin văn bản MINESMAP.INP, gồm nhiều dòng:
- Dòng 1: 2 số nguyên dương M, N (9 ≤ M, N ≤ 30)
- M dòng tiếp theo: mỗi dòng chứa N số nhị phân (0, 1) đánh dấu ô có và không có mìn của bản đồ mìn kích thước M x N
Kết quả: đưa ra tập tin văn bản MINESMAP.OUT bản đồ mật độ mìn
Các giá trị trên cùng 1 dòng cách nhau đúng một khoảng trắng
Ví dụ:
9 9
0 1 1 0 0 0 0 0 0
1 0 0 1 0 0 0 0 1
0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 1
0 0 0 0 1 1 0 1 0
2 * * 2 1 0 0 1 1
* 4 5 * 2 0 0 1 *
1 2 * * 2 0 0 2 2
0 1 2 3 3 2 2 2 *
0 0 0 1 * * 2 * 2
0 0 0 1 2 2 2 1 1
Trang 60 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 1 0 0
0 0 1 0 0 0 0 0 1
0 0 0 1 1 2 1 1 0
0 1 1 2 * 2 * 2 1
0 1 * 2 1 2 1 2 *
Câu 3: Trò chơi dò mìn (2 điểm)
Tên tập tin chương trình: CLICK.???
Trong trò chơi dò mìn Minesweeper, bản đồ mật độ mìn sẽ được tạo ra, trong đó ô có giá trị * là ô có mìn, ô có giá trị là một số X từ 0 đến 8 là ô không có mìn nhưng có X ô có mìn kề với ô đó Thao tác nhấn chuột trái của trò chơi Minesweeper vào 1 ô trên bản đồ mật
độ mìn (bị che kín) sẽ xảy ra 3 trường hợp như sau:
- Nếu gặp ô có mìn thì mìn nổ
- Nếu gặp ô có số dương thì mở ô đó ra
- Ngược lại, nếu gặp ô có số 0 thì mở một vùng, vùng này bao gồm các ô không có mìn với biên của vùng là các ô có số dương, hoặc là biên của bản đồ mật độ mìn Ví dụ với bản đồ mật độ mìn là:
2 * * 2 1 0 0 1 1 2 * * 2 1 0 0 1 1
* 4 5 * 2 0 0 1 * * 4 5 * 2 0 0 1 *
1 2 * * 2 0 0 2 2 1 2 * * 2 0 0 2 2
0 1 2 3 3 2 2 2 * 0 1 2 3 3 2 2 2 *
0 0 0 1 * * 2 * 2 0 0 0 1 * * 2 * 2
0 0 0 1 2 2 2 1 1 0 0 0 1 2 2 2 1 1
0 0 0 1 1 2 1 1 0 0 0 0 1 1 2 1 1 0
0 1 1 2 * 2 * 2 1 0 1 1 2 * 2 * 2 1
0 1 * 2 1 2 1 2 * 0 1 * 2 1 2 1 2 *
khi nếu nhấn vào ô (2, 6) thì sẽ có 16 ô bị mở ra
Để thuận tiện cho việc đọc dữ liệu để xử lý, trong tập tin dữ liệu vào, các ô có mìn (*)
sẽ được thay thế bằng giá trị là 9!
Với bài tập lớn là xây dựng trò chơi dò mìn Minesweeper, Nam cần viết một chương trình mô tả thao tác nhấn chuột trái của trò chơi Minesweeper
Yêu cầu: đếm số ô được mở ra khi nhấn chuột trái vào một ô xác định trên bản đồ mật
độ mìn cho trước
Dữ liệu: vào từ tập tin văn bản CLICK.INP, gồm nhiều dòng:
- Dòng 1: 2 số nguyên dương M, N (9 ≤ M, N ≤ 30) là kích thước của bản đồ mật độ mìn
- Dòng 2: 2 số nguyên dương A, B (1 ≤ A ≤ M, 1 ≤ B ≤ N) là số hàng và cột của ô sẽ
bị nhấn chuột trái
- M dòng tiếp theo: mỗi dòng chứa N các chữ số thập phân (0 ÷ 9) biểu diễn bản đồ mật độ mìn kích thước M x N
Kết quả: đưa ra tập tin văn bản CLICK.OUT số ô bị mở ra
Các giá trị trên cùng 1 dòng cách nhau đúng một khoảng trắng
Ví dụ:
9 9
2 6
2 9 9 2 1 0 0 1 1
9 4 5 9 2 0 0 1 9
1 2 9 9 2 0 0 2 2
0 1 2 3 3 2 2 2 9
16
Trang 70 0 0 1 9 9 2 9 2
0 0 0 1 2 2 2 1 1
0 0 0 1 1 2 1 1 0
0 1 1 2 9 2 9 2 1
0 1 9 2 1 2 1 2 9
Học viên - sinh viên không được sử dụng tài liệu
Trang 8PHÊ DUYỆT
CHỦ NHIỆM KHOA
Đại tá, ThS Nguyễn Văn Khiêm
KHOA CÔNG NGHỆ THÔNG TIN
Kỳ thi: Học viên sinh viên giỏi môn Tin học Đối tượng: Đại học Chuyên tin
Hình thức: Thực hành Thời gian: 120 phút
ĐỀ SỐ 02 Câu 1: Số dư khi chia cho 9 (4 điểm)
Tên tập tin chương trình: REMAIN9.???
Để tìm số dư khi chia một số nguyên dương N (không quá lớn) cho 9, người ta có thể
dùng cách chia trực tiếp Tuy nhiên, với các số nguyên dương rất lớn, có thể lên tới hàng trăm chữ số, cách chia trực tiếp là không hợp lý Khi đó quy tắc đồng dư sau đây sẽ được sử dụng: "Số dư của một số N khi chia cho 9 = số dư của X khi chia cho 9 với X là tổng các chữ số của N"
Ví dụ: với N = 11234567800000, tổng các chữ số của N là:
X = 1+1+2+3+4+5+6+7+8+0+0+0+0+0 = 37
Số dư khi chia N cho 9 = Số dư khi chia 37 cho 9 = 1
Yêu cầu: viết chương trình tìm số dư của N khi chia cho 9 theo quy tắc đồng dư trên
Dữ liệu: vào từ tập tin văn bản REMAIN9.INP số nguyên dương N (N ≤ 10200)
Kết quả: đưa ra tập tin văn bản REMAIN9.OUT số dư khi chia N cho 9
Ví dụ:
Câu 2: Phân tích số (4 điểm)
Tên tập tin chương trình: ANALYSIS.???
Trong giờ học môn Toán, nhóm của Nam đang tranh luận về cách phân tích một số nguyên dương N thành tổng của 2 số nguyên dương A, B sao cho tích P = A2 * B2 đạt cực đại Để chứng minh kết quả phân tích của mình là đúng, Nam quyết định viết một chương trình minh họa cho bài toán này
Yêu cầu: liệt kê tất cả các kết quả phân tích số N theo thứ tự tăng dần về giá trị của các tích P, các giá trị P bằng nhau chỉ được xuất hiện 1 lần
Dữ liệu: vào từ tập tin văn bản ANALYSIS.INP số nguyên dương N (1 < N ≤ 103) Kết quả: đưa ra tập tin văn bản ANALYSIS.OUT các giá trị của tích P, các số cách nhau đúng 1 khoảng trắng
Ví dụ:
Câu 3: Trò chơi dò mìn (2 điểm)
Tên tập tin chương trình: CLICK.???
Trong trò chơi dò mìn Minesweeper, bản đồ mật độ mìn sẽ được tạo ra, trong đó ô có giá trị * là ô có mìn, ô có giá trị là một số X từ 0 đến 8 là ô không có mìn nhưng có X ô có mìn kề với ô đó Thao tác nhấn chuột trái của trò chơi Minesweeper vào 1 ô trên bản đồ mật
độ mìn (bị che kín) sẽ xảy ra 3 trường hợp như sau:
- Nếu gặp ô có mìn thì mìn nổ
- Nếu gặp ô có số dương thì mở ô đó ra
Trang 9- Ngược lại, nếu gặp ô có số 0 thì mở một vùng, vùng này bao gồm các ô không có mìn với biên của vùng là các ô số, hoặc là biên của bản đồ mật độ mìn Ví dụ với bản đồ mật độ mìn là:
2 * 2 * 1 0 0 0 0 2 * 2 * 1 0 0 0 0
* 3 3 2 1 0 0 0 0 * 3 3 2 1 0 0 0 0
1 2 * 2 1 1 0 1 1 1 2 * 2 1 1 0 1 1
1 3 3 3 * 1 0 1 * 1 3 3 3 * 1 0 1 *
2 * * 2 1 2 1 3 2 2 * * 2 1 2 1 3 2
* 4 3 1 0 2 * 3 * * 4 3 1 0 2 * 3 *
2 * 1 0 0 2 * 4 2 2 * 1 0 0 2 * 4 2
1 1 1 0 1 2 3 * 1 1 1 1 0 1 2 3 * 1
0 0 0 0 1 * 2 1 1 0 0 0 0 1 * 2 1 1
khi nếu nhấn vào ô (3, 7) thì sẽ có 21 ô bị mở ra
Để thuận tiện cho việc đọc dữ liệu để xử lý, trong tập tin dữ liệu vào, các ô có mìn (*)
sẽ được thay thế bằng giá trị là 9!
Với bài tập lớn là xây dựng trò chơi dò mìn Minesweeper, Nam cần viết một chương trình mô tả thao tác nhấn chuột trái của trò chơi Minesweeper
Yêu cầu: đếm số ô được mở ra khi nhấn chuột trái vào một ô xác định trên bản đồ mật
độ mìn cho trước
Dữ liệu: vào từ tập tin văn bản CLICK.INP, gồm nhiều dòng:
- Dòng 1: 2 số nguyên dương M, N (9 ≤ M, N ≤ 30) là kích thước của bản đồ mật độ mìn
- Dòng 2: 2 số nguyên dương A, B (1 ≤ A ≤ M, 1 ≤ B ≤ N) là số hàng và cột của ô sẽ
bị nhấn chuột trái
- M dòng tiếp theo: mỗi dòng chứa N các chữ số thập phân (0 ÷ 9) biểu diễn bản đồ mật độ mìn kích thước M x N
Kết quả: đưa ra tập tin văn bản CLICK.OUT số ô bị mở ra
Các giá trị trên cùng 1 dòng cách nhau đúng một khoảng trắng
Ví dụ:
9 9
3 7
2 9 2 9 1 0 0 0 0
9 3 3 2 1 0 0 0 0
1 2 9 2 1 1 0 1 1
1 3 3 3 9 1 0 1 9
2 9 9 2 1 2 1 3 2
9 4 3 1 0 2 9 3 9
2 9 1 0 0 2 9 4 2
1 1 1 0 1 2 3 9 1
0 0 0 0 1 9 2 1 1
21
Học viên - sinh viên không được sử dụng tài liệu