Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 45 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
45
Dung lượng
8,57 MB
Nội dung
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM KHOA CÔNG NGHỆ THƠNG TIN HỆ CHÍNH QUI – LỚP CỬ NHÂN TÀI NĂNG 2014 MƠN: NHẬP MƠN LẬP TRÌNH BÀI TẬP TỔNG HỢP ĐẶNG HOÀNG HẢI ĐỖ NGUYÊN KHA TP.HCM, ngày 21 tháng 12 năm 2014 {dhhai, dnkha}@fit.hcmus.edu.vn Tính tốn Viết hàm tính tổng 𝑆 𝑛 = 𝑥 + 𝑥 ! + 𝑥 ! + ⋯ + 𝑥 ! Viết hàm tính tổng 𝑆 𝑛 = 𝑥 + !! !!! + !! !!!!! !! + ⋯+ !!!!!!⋯!! Viết hàm tính xấp xỉ 𝑒 ! khai triển Taylor sau (𝑥 số thực): 𝑥! 𝑥! 𝑒 =1+𝑥+ + +⋯= 2! 3! ! ! !!! 𝑥! 𝑛! Hãy tính 𝑒 ! xấp xỉ với số lũy thừa 𝑛 = 5, 𝑛 = 10, 𝑛 = 20, 𝑛 = 50 v.v Xuất kết 10 chữ số thập phân để thấy độ xác xấp xỉ Viết hàm tính xấp xỉ sin 𝑥 khai triển Taylor sau (𝑥 số thực tính radian): 𝑥! 𝑥! 𝑥! 𝑥! sin 𝑥 = 𝑥 − + − + − ⋯ = 3! 5! 7! 9! ! −1 !!! ! 𝑥 !!!! (2𝑛 + 1)! Hãy tính sin 𝑥 xấp xỉ với số lũy thừa 𝑛 = 5, 𝑛 = 10, 𝑛 = 20, 𝑛 = 50 v.v Xuất kết 10 chữ số thập phân để thấy độ xác xấp xỉ Hãy xác định khai triển Taylor cos 𝑥 tính xấp xỉ Viết hàm tính tổng tất ước số nguyên dương số nguyên dương n Viết hàm tính tích tất ước số nguyên dương số nguyên dương n {dhhai, dnkha}@fit.hcmus.edu.vn Viết hàm kiểm tra số ngun dương n có phải số hồn hảo (perfect number) hay khơng Số hồn hảo số tổng tất ước số dương trừ Ví dụ số số hồn hảo: = + + Ví dụ số 28 số hoàn hảo: 28 = + + + + 14 Số hoàn hảo chẵn: Euclid chứng minh 2!!! (2! − 1) số hoàn hảo chẵn 2! − số nguyên tố Để 2! − số nguyên tố (số nguyên tố Mersenne), thân 𝑝 phải số nguyên tố: 2! − nguyên tố ⇒ 𝑝 nguyên tố Điều ngược lại không đúng: 𝑝 nguyên tố ⇏ 2! − nguyên tố Ví dụ: 𝑝 = 2: 2! 2! − = 𝑝 = 3: 2! 2! − = 28 𝑝 = 5: 2! 2! − = 496 Dựa vào kết Euclid, đề xuất thuật tốn hiệu kiểm tra số có phải số hồn hảo chẵn hay khơng 10 Viết hàm đếm tần số chữ số thập phân số ngun n Ví dụ: 123456789 có tần số là: 0:0, 1:1, 2:1, 3:1, 4:1, 5:1, 6:1, 7:1, 8:1, 9:1 1996 có tần số là: 0:0, 1:1, 2:0, 3:0, 4:0, 5:0, 6:1, 7:0, 8:0, 9:2 11 Viết hàm tính tổng bù không 10 chữ số thập phân số nguyên n Ví dụ: 123456789 => 45 => {dhhai, dnkha}@fit.hcmus.edu.vn 12 Viết hàm tính ước chung lớn số nguyên dương a, b 13 Viết hàm tính bội chung nhỏ số nguyên dương a, b 14 Viết hàm cài đặt thuật toán hiệu để kiểm tra số tự nhiên n có phải số lũy thừa hồn hảo (perfect power) hay khơng n số lũy thừa hồn hảo có dạng n = a^b với a, b số tự nhiên >1 15 Viết hàm đếm số bit số nguyên n Phương pháp Newton Phương pháp Newton phương pháp tìm nghiệm thực phương trình 𝑓 𝑥 = 0, cách cải thiện xấp xỉ nghiệm 𝑥 qua bước lặp Cụ thể sau: Cho trước hàm 𝑓(𝑥) xác định ℝ, có đạo hàm 𝑓 ! , ta bắt đầu với 𝑥! dự đoán (guess) nghiệm 𝑥 𝑓 𝑥 = Ta cải thiện xấp xỉ nghiệm 𝑥 𝑥! , với 𝑥! = 𝑥! − 𝑓 𝑥! 𝑓 ! 𝑥! Quá trình cải thiện lặp sau: 𝑥!!! = 𝑥! − 𝑓 𝑥! 𝑓 ! 𝑥! với n đủ lớn đạt độ xác mong muốn {dhhai, dnkha}@fit.hcmus.edu.vn 16 Viết hàm tính bậc (square root) dựa phương pháp Newton Hàm tính 𝑆 thực chất hàm tìm nghiệm phương trình 𝑓 𝑥 = 𝑥 ! − 𝑆 = Khởi động với 𝑥! = 1, sử dụng phương pháp Newton tính xấp xỉ bậc số thực dương 𝑆, với số lần lặp cải tiến xấp xỉ 𝑛 = 5, 𝑛 = 10, 𝑛 = 20, 𝑛 = 50 v.v Xuất kết 10 chữ số thập phân để thấy độ xác xấp xỉ 17 Mở rộng hàm tính bậc với mức xấp xỉ (sai số) 𝜀 Tức dừng vòng lặp cải tiến xấp xỉ thấy sai số 𝑥! 𝑥!!! nhỏ 𝜀: 𝑥! − 𝑥!!! < 𝜀 Thử nghiệm đếm số vòng lặp cần thực với giá trị khác 𝜀 18 Thay đổi hàm tính bậc với giá trị khởi tạo ban đầu 𝑥! tốt Nếu giá trị khởi tạo ban đầu xa so với giá trị thực, tốc độ hàm tính bị giảm thiểu Ta cần chọn giá trị ban đầu 𝑥! gần với giá trị thực để tăng tốc thuật toán Nếu biểu diễn nhị phân 𝑆 có dạng 𝑎×2!! , với 0.1! ≤ 𝑎 < 10! , 𝑆 = 𝑎×2! , ta xấp xỉ thơ 𝑆 ≈ 2! , tức khởi động 𝑥! = 2! 19 Hãy viết hàm cài đặt thuật tốn tính bậc (cube root - ∛) phương pháp Newton 20 Xét công thức tính trung bình sau: !!! 𝐴𝑣𝑒𝑟𝑎𝑔𝑒 = !!! 𝑎! − 𝑀𝑎𝑥 !!! ! + 𝑎! − 𝑀𝑖𝑛 !!! ! + 𝑛 𝑀𝑎𝑥 − 𝑀𝑖𝑛 ! {dhhai, dnkha}@fit.hcmus.edu.vn Trong 𝑀𝑎𝑥, 𝑀𝑖𝑛 giá trị lớn nhất, nhỏ 𝑛 số thực 𝑎! , 𝑎! , 𝑎! , … , 𝑎!!! Hãy viết hàm tính 𝐴𝑣𝑒𝑟𝑎𝑔𝑒 mà khơng dùng mảng để lưu trữ phần tử Các phần tử truyền vào liên tục cách đọc từ nhập chuẩn/tập tin Thao tác mảng 21 Viết hàm tìm số âm lớn mảng chiều số thực Trả khơng thấy số âm 22 Viết hàm tìm số nguyên tố lớn mảng chiều số ngun Trả khơng tìm thấy số nguyên tố 23 Viết hàm tìm mảng chiều số thực số xa x (x cho trước) 24 Viết hàm tìm ước chung lớn tất số mảng chiều số nguyên dương 25 Viết hàm tìm bội chung nhỏ tất số mảng chiều số nguyên dương 26 Viết hàm phát sinh ngẫu nhiên mảng n số nguyên khoảng [a, b] 27 Viết hàm đếm tần suất xuất giá trị x mảng chiều số thực 28 Viết hàm đếm tần suất xuất số mảng chiều số nguyên Sắp kết tần suất theo giá trị số với thứ tự tăng dần 29 Viết hàm dịch phải xoay vòng k lần phần tử mảng 30 Viết hàm tính khoảng cách trung bình giá trị mảng chiều số thực Khoảng cách số tính giá trị tuyệt đối {dhhai, dnkha}@fit.hcmus.edu.vn 31 Viết hàm tính vector n chiều tổng vector n chiều số thực cho trước Mỗi vector n chiều mảng n phần tử, với phần tử đại diện cho chiều i Vector 𝐯 = (𝑣! , 𝑣! , … , 𝑣! , … , 𝑣!!! , 𝑣! ) Phép cộng vector n chiều thực cách cộng giá trị theo chiều 32 Viết hàm tính tích vơ hướng vector n chiều số thực cho trước Tích vơ hướng 𝐯 ∙ 𝐯 ! = ! ! !!! 𝑣! 𝑣! ! ! !!! 𝑣! 33 Viết hàm tính độ lớn vector n chiều số thực Độ lớn 𝐯 = 34 Viết hàm tính góc 𝜃 vector n chiều số thực, tính theo radian Biết cos 𝜃 = cos !! 𝐯∙𝐯 ! 𝐯 𝐯! biết khai triển Taylor hàm ngược cos !! 𝑥 với 𝑥 ≤ 1 𝑥! 𝑥! 𝑥! 𝑥= 𝜋− 𝑥+ + + + ⋯ = 𝜋 − 2 24 246 ! !!! (2𝑛)! 𝑥 !!!! 4! 𝑛! ! 2𝑛 + 35 Cho trước mảng số thực chiều tăng dần có kích thước n m Viết hàm trộn mảng ban đầu thành mảng chiều có kích thước n+m, có phần tử phần tử mảng ban đầu tăng dần (Merge sort) 36 Tìm phần tử lớn thứ k mảng Cho mảng chiều n số thực, viết hàm tìm phần tử lớn thứ k mảng, tức phần tử lớn k-1 số mảng, nhỏ n-k số lại 37 Phân hoạch mảng chiều (Quicksort partition) Cho mảng chiều n số thực, phân hoạch lại mảng (sắp lại phần tử mảng) để đồng thời thỏa tất điều kiện sau: {dhhai, dnkha}@fit.hcmus.edu.vn • Phần tử lớn thứ n/2 nằm vị trí n/2 mảng (vị trí đếm từ 1) • Các phần tử nhỏ phần tử lớn thứ n/2 nằm trước phần tử n/2 mảng (bên trái mảng) Thứ tự phần tử khơng quan trọng • Các phần tử lớn phần tử lớn thứ n/2 nằm sau phần tử n/2 mảng (bên phải mảng) Thứ tự phần tử không quan trọng 38 Một ma trận nxm (n dịng, m cột) biểu diễn mảng chiều nxm Hãy viết hàm tính ma trận tổng C ma trận nxm A B: C = A + B Ma trận tổng C ma trận nxm với phần tử C(i,j) = A(i,j) + B(i,j) 39 Hãy viết hàm tính ma trận hiệu C = A – B: C(i,j) = A(i,j) – B(i,j) 40 Viết hàm tính tích hai ma trận Hai ma trận nhân với số cột ma trận trước số dịng ma trận sau Tích ma trận A nxp với ma trận B pxm ma trận C nxm, với C(i,j) = tích vơ hướng dòng i A với cột j B 41 Viết hàm tìm điểm yên ngựa ma trận Điểm yên ngựa điểm có giá trị nhỏ hàng lớn cột, điểm có giá trị lớn hàng nhỏ cột {dhhai, dnkha}@fit.hcmus.edu.vn Cấu trúc 42 Viết cấu trúc Phân số, tử số nguyên, mẫu số nguyên dương Viết hàm tính tổng, hiệu, tích, thương phân số Viết hàm rút gọn phân số Viết hàm in phân số, in dạng hỗn số 43 Viết cấu trúc Số phức, với số phức c có dạng c = a + bi, với a, b số thực, a phần thực, b phần ảo Viết hàm tính tổng, hiệu, tích, thương số phức, biết i^2 = -1 Viết hàm tính lũy thừa bậc n số phức 44 Viết hàm tính khoảng cách trung bình phần tử mảng chiều điểm 2D (2 chiều tọa độ x, y) theo khoảng cách Euclid 45 Viết hàm tính khoảng cách trung bình phần tử mảng chiều điểm 2D (2 chiều tọa độ x, y) theo khoảng cách Manhattan 46 (Closest pair) Viết hàm tìm điểm gần mảng điểm 2D Khoảng cách tính theo khoảng cách Euclid 47 Viết hàm tính khoảng cách trung bình phần tử mảng chiều điểm 3D (3 chiều tọa độ x, y, z) theo khoảng cách Euclid 48 Viết cấu trúc Đơn thức biểu diễn đơn thức dạng 𝑃(𝑥) = 𝑎𝑥 ! , với a hệ số n số mũ Viết hàm tính giá trị 𝑃(𝑥) với giá trị cụ thể 𝑥, hàm tính tích, thương đơn thức 49 Viết cấu trúc Đa thức biểu diễn đa thức dạng 𝑃 𝑥 = 𝑎! 𝑥 ! + 𝑎!!! 𝑥 !!! + ⋯ + 𝑎! 𝑥! + 𝑎! Viết hàm tính giá trị đa thức với giá trị cụ thể biến 𝑥, hàm tính tổng, hiệu, tích, thương, phần dư đa thức 10 {dhhai, dnkha}@fit.hcmus.edu.vn 50 Viết cấu trúc Ngày (datetime) biểu diễn thời gian, gồm thông tin ngày/tháng/năm giờ/phút/giây Viết hàm nhận vào datetime và: • Kiểm tra năm nhuận • Xác định ngày thứ năm • Xác định ngày thứ tuần • Xác định giây thứ năm • Xác định khoảng cách thời điểm datetime tính giây/phút/giờ/ngày/tháng/năm 51 Viết cấu trúc Tam giác không gian chiều gồm tọa độ đỉnh tam giác Viết hàm: • Kiểm tra đỉnh có tạo thành tam giác khơng • Tính chu vi, diện tích tam giác • Tính tọa độ trọng tâm tam giác • Phân loại tam giác: đều, vuông, vuông cân, cân, thường 52 Đường trịn khơng gian 2D biểu diễn tọa độ tâm bán kính Cho mảng đường trịn 2D, viết hàm tìm xem có đường tròn bao hết tất đường tròn khác mảng hay không 53 Xây dựng cấu trúc vé xem phim dựa vé xem phim thực tế sau: 11 {dhhai, dnkha}@fit.hcmus.edu.vn Cho thông điệp: M = “Khoa CNTT” CÁC BƯỚC MÃ HÓA Xác định 𝒔 𝒕 Với 𝑛 lưu trữ byte, để đảm bảo ≤ 𝑚! < 𝑛, ta chọn kích thước 𝑚! 𝑠 = byte Để lưu 𝑐! , 𝑐! lên tới giá trị 𝑛 − 1, ta cần 𝑡 = byte Chuyển đổi M Ta có chuỗi M lưu trữ tất 10 byte (tính kí tự kết thúc chuỗi): K h o a C N T T ‘\0’ 4E 54 54 00 Biểu diễn byte dạng thập lục phân ta có 4B 68 6F 61 20 43 Ta cần chia M thành khối 𝑠 = byte, cần bổ sung thêm byte 0, gom thành khối 3: 4B 68 6F 61 20 43 4E 54 54 00 00 00 Vậy ta có 𝑘 = khối số nguyên 𝑚! Mã hóa 𝒎𝒊 Ta mã hóa RSA số 𝑚! thành số 𝑐! , cách tính 𝑚! = 𝑐!! mod 𝑛 Để ý số 𝑐! biểu diễn 𝑡 = byte 4B686F 612043 4E5454 000000 𝑐! = 𝑚!! mod 𝑛 42AF41C5 53D4EA1F 713E1995 00000000 Ta thu C mảng 16 byte, in dạng thập lục phân: 42 AF 41 C5 53 D4 EA 1F 71 3E 19 95 00 00 00 00 CÁC BƯỚC GIẢI MÃ 32 {dhhai, dnkha}@fit.hcmus.edu.vn Xác định 𝒔 𝒕 Tương tự bước mã hóa, ta xác định 𝑠 = 𝑡 = Giải mã Chia C thành khối t byte, giải mã khối cách tính 𝑚!! = 𝑐!! mod 𝑛 42AF41C5 53D4EA1F 713E1995 00000000 𝑚!! = 𝑐!! mod 𝑛 004B686F 00612043 004E5454 00000000 Chuyển đổi thành văn M’ Sau giải mã ta thu số nguyên, tương ứng với khối 𝑡 byte Ta cần chuyển khối thành 𝑠 byte 4B 68 6F 61 20 43 4E 54 54 00 00 00 Ta thu M’ phù hợp với rõ M ban đầu M’ = “Khoa CNTT” THUẬT TOÁN LŨY THỪA MOD Để thực nhanh phép tốn lũy thừa modulo, ví dụ tính 𝑐 = 𝑚! mod 𝑛, ta sử dụng thuật toán nhị phân sau Input: 𝑎 𝑏 𝑛 Output: 𝑐 = 𝑎! mod 𝑛 Biểu diễn 𝑏 thành dạng nhị phân gồm 𝑘 bit 𝑏 = 𝑏! 𝑏!!! ⋯ 𝑏! 𝑏! = ! !!! !!! 𝑏! ×2 Nếu 𝑏! = gán 𝑐 ≔ 𝑎, không gán 𝑐 ≔ Lặp 𝑖 ≔ 𝑘 − → 3a Gán 𝑐 ≔ 𝑐×𝑐 mod 𝑛 3b Nếu 𝑏! = gán 𝑐 ≔ 𝑎×𝑐 mod 𝑛 Trả 𝑐 33 {dhhai, dnkha}@fit.hcmus.edu.vn 71 GAME OF LIFE “Game of Life” trò chơi tự động giả lập sống tế bào, với quy luật đưa nhà toán học John Conway năm 1970 Khơng gian trị chơi bàn cờ chiều vô hạn với ô vuông tế bào Trong hệ, tế bào có trạng thái sống chết Conway đưa quy luật để tế bào tiến hóa (chuyển sang trạng thái sống chết) qua hệ Theo đó, sống tế bào hệ thứ 𝑛 định tế bào lân cận hệ thứ 𝑛 − Các quy luật tóm tắt sau: Một tế bào sống có tế bào sống lân cận chết hệ Một tế bào sống có nhiều tế bào sống lân cận chết hệ Một tế bào sống có tế bào sống lân cận tiếp tục sống hệ Một tế bào chết có tế bào sống lân cận sống lại hệ Bạn cần viết chương trình giả lập tiến hóa tế bào nhân tạo này, không gian chiều hữu hạn Các tế bào nằm biên giới hạn không gian coi tế bào chết Ví dụ: tế bào sống tế bào chết 34 {dhhai, dnkha}@fit.hcmus.edu.vn hệ hệ hệ 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 hệ 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 hệ 0 0 0 0 0 0 1 0 0 0 0 0 INPUT Dữ liệu nhập không gian trạng thái ban đầu, gồm tế bào sống chết Với khơng gian trạng thái, dịng gồm số nguyên không âm M N G cách khoảng trắng, M số dịng, N số cột không gian G số hệ tiến hóa (0 ≤ 𝑀, 𝑁 ≤ 100, ≤ 𝐺 ≤ 50) M dịng cịn lại lưu khơng gian trạng thái, dòng N số, với số cho tế bào sống số cho tế bào chết Dữ liệu nhập kết thúc gặp số không cần xử lý OUTPUT 35 {dhhai, dnkha}@fit.hcmus.edu.vn Với không gian trạng thái, xuất dòng số nguyên M N G cách khoảng trắng Các dòng xuất không gian trạng thái hệ thứ G (coi không gian nhập hệ thứ 0) INPUT MẪU OUTPUT MẪU 0 0 0 0 0 0 0 0 0 0 0 0 0 0 50 1 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 50 1 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 HƯỚNG DẪN Để mô tả vùng khơng gian trạng thái tế bào ta khai báo hai biến M, N tương ứng với chiều dài, chiều rộng mảng hai chiều arr[MAXM][MAXN] (MAXM, MAXN chiều dài chiều rộng tối đa) Tuy nhiên, để viết mã nguồn tiện lợi (như khai báo truyền tham số cho hàm), ta khai báo struct: struct chess { int M, N; int value[MAXM + 2][MAXN + 2]; }; VÙNG ĐỆM 36 {dhhai, dnkha}@fit.hcmus.edu.vn Việc bổ sung thêm hai dòng hai cột để chứa vùng biên đệm bao quanh khơng gian thực gồm tồn tế bào chết Vùng không gian cần xử lý nằm từ dòng tới M từ cột tới N thay từ tới M – từ tới N – thường lệ Ví dụ, với khơng gian kích thước x ta có khơng gian sau (các ô tô màu xám vùng đệm): 0 0 0 0 0 0 0 0 Sự thay đổi đem tới ích lợi cụ thể Giả sử sử dụng cách đánh số từ 0, khơng có vùng đệm Để biết tế bào ô (0, 2) sống hay chết ta cần phải xét ô xung quanh Tuy nhiên, khơng gian khơng có (-1, 1), (-1, 2) (-1, 3) nên ta truy cập tới mảng value để biết nơi chứa tế bào sống hay chết Cịn lại ô, truy cập tới phần tử value[0][1], value[0][3], value[1][1], value[1][2] value[1][3] để biết chỗ tế bào chết hay sống Trong hình vẽ đây, ô đánh dấu tương ứng với ô (0, 2) ô có dấu X nơi truy cập tới value để biết tế bào sống hay chết X X X X X Tương tự, với (0, 0) xét ô xung quanh (0, 1), (1, 0) (1, 1) Như vậy, ô nằm biên hay góc, cần phải có xử lý riêng 37 {dhhai, dnkha}@fit.hcmus.edu.vn Vấn đề hồn tồn tránh cách sử dụng dòng cột đệm xung quanh Ta đánh số dịng cột từ Lúc này, (0, 2) thành ô (1, 3) Quan trọng nhất, ô xung quanh cần xét nằm vùng khơng gian Tóm lại, ta truy cập tới mảng value để biết tế bào sống hay chết mà không sợ phát sinh lỗi khơng tồn Ơ LÂN CẬN Một vấn đề kỹ thuật khác cần giải xác định ô xung quanh ô (u, v) Cách đơn giản ta viết hai vòng for lồng sau: for (int i = u – 1; i