1. Trang chủ
  2. » Tất cả

Tin THPT - Pham Quang Thang - THPT Mai Anh Tuan - Nga Son

14 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 14
Dung lượng 79,5 KB

Nội dung

A ĐẶT VẤN ĐỀ I.LỜI MỞ ĐẦU Hiện vấn đề luyện thi học sinh giỏi môn tin học cấp trung học phổ thông, mà cụ thể ngôn ngữ lập trình pascal thuộc chương trình tin học 11, chương trình tin học 11 sách giáo khoa cung cấp số kiểu liệu số tập Bởi em học sinh, việc cung cấp cho em hệ thống tập việc khó, giải toán vượt khả xử lý kiểu liệu lại việc khó nhiều, đặc biệt vấn đề xử lý số lớn Đây chuyên đề lớn gây đau đầu cho giáo viên giảng dạy tin học cấp trung học phổ thông mà vấn đề nghiên cứu chuyên gia để tối ưu dần, để giảm thiểu thời gian xử lý tốn có nhiều chữ số Tơi chọn đề tài: “BÀI TỐN CƠ BẢN VỀ XỬ LÝ SỐ LỚN TRONG LUYỆN THI HỌC SINH GIỎI MÔN TIN HỌC CẤP THPT” Để giúp em có cách đơn giản để giải toán vấn đề xử lý số lớn Giúp cho giáo viên trung học phổ thông làm nhiệm vụ tơi có thêm tư liệu để tham khảo Trên sở nghiên cứu phát triển rộng chuyên đề luyện thi học sinh gỏi cấp trung học phổ thơng II- MỤC ĐÍCH NGHIÊN CỨU: - Để làm tốt công tác luyện thi học sinh giỏi môn tin học cấp trung học phổ thông - Về nội dung: Một số toán xử lý số lớn III- NHIỆM VỤ NGHIÊN CỨU: Nhiệm vụ một: - Tìm hiểu ý tưởng thuật toán xử lý số lớn: Thuật toán cộng, trừ, nhân, chia số lớn Nhiệm vụ hai: Cài đặt chương trình giải tốn cộng, trừ, nhân, chia số lớn Nhiệm vụ ba: Chạy thử chương trình sở test Nhiệm vụ bốn: Một số ý kiến đề xuất IV-PHƯƠNG PHÁP NGHIÊN CỨU: - Kinh nghiệm giáo dục thân trình giảng dạy, luyện thi học sinh giỏi môn tin học - Trao đổi với chuyên môn với đồng nghiệp - Nghiên cứu tài liệu liên quan V-ĐỊA ĐIỂM NGHIÊN CỨU VÀ ÁP DỤNG ĐỀ TÀI: - Trường THPT Mai Anh Tuấn VI-ĐÓNG GÓP CỦA ĐỀ TÀI Góp phần làm phong phú thêm tư liệu luyện thi học sinh giỏi môn tin học trường THPT tỉnh Thanh Hóa B NỘI DUNG I- CƠ SỞ LÝ LUẬN CỦA VẤN ĐỀ NGHIÊN CỨU: 1- Cơ sở lý luận - Các toán cộng, trừ, nhân, chia số lớn bốn toán mà tất toán xử lý số lớn phải sử dụng 2- Cơ sở thực tiễn - Đối với em học sinh việc cài đặt thuật toán cộng, trừ, nhân, chia số lớn việc tương đối khó Việc tiếp thu thuật tốn giúp em nắm bắt công việc cần làm giải toán xử lý số lớn II-VẤN ĐỀ LUYỆN THI HSG MÔN TIN HỌC NHÀ CỦA TRƯỜNG Những thuận lợi khó khăn công tác luyện thi học sinh giỏi môn tin học *Thuận lợi: Được quan tâm ban giám hiệu nhà trường tạo điều kiện cho thầy trị học tập Có nhiều em học sinh có khả tư tốt Có khả nắm bắt thuật toán Vận dụng thuật toán để giải tập cách linh hoạt *Khó khăn: - Đa số em làm quen với tin học, đặc biệt học lập trình PASCAL em thực tiếp xúc từ đầu năm lớp 11 Việc nắm bắt thuật tốn khó nằm ngồi sách giáo khoa việc khó kiến thức em hạn chế - Bộ môn tin học coi môn phụ nên việc tiến hành giảng dạy cho đội tuyển thường phải học vào ca tối Do khơng thuận tiện cho học sinh vấn đề Nội dung *Ý tưởng chung: Chúng ta dùng xâu ký tự để biểu diễn số nguyên lớn sau: Các chữ số viết theo chiều ngược lại Nếu số nguyên có n chữ số xâu tương ứng có n+2 byte (phía cuối thêm byte, byte thứ chứa dấu '-' số âm, null số dương, byte cuối null) Ví dụ, số a = 1234567890123 biểu diễn xâu xa = "3210987654321"nullnull, b = -12345678901234 biểu diễn xâu xb = "43210987654321-"null Để xác định số -a ta việc thay null '-' , –b nhận cách thay '-' null Việc biểu diễn ngược thuận tiện thao tác cộng, trù, nhân chia mà chèn thêm '0' (leading zero) Sau số giải thuật cộng, trù, nhân chia số không âm (Các số âm nói sau) Trước hết, ta cần định nghĩa số hàm dùng việc cộng trừ nhân chia chữ số: Chú thích dịng viết tắt tên hàm: chu_so: Hàm đổi ký tự số thành số so_chu: Hàm đổi số thành ký tự số cong_xau : Hàm cộng hai xâu số tru_kt : Hàm trừ giá trị hai ký tự số tru_xau : Hàm trừ hai xâu số nhan_xau_kt : Hàm nhân xâu ký tự nhan_xau_xau: Nhân xâu ký tự số xâu ký tự số (*Hàm đổi giá trị chữ thành số*) Function chu_so(ch : char):byte; Begin Chu_so:=ord(ch) - 48; End; (*Hàm đổi giá trị số thành chữ*) Function so_chu(num : byte):char; Begin So_chu:=chr(num+48); End; Giải thuật cộng: Thơng thường, cộng hai số có nhiều chữ số, thực từ phải qua trái Với lần cộng, kết cịn cộng với giá trị nhớ lần trước đồng thời xác định giá trị nhớ Ở đây, số lưu theo chiều ngược lại nên thực từ trái qua phải, tức từ đầu đến cuối xâu Function cong_xau(st1,st2:string):string; Var i,j, nho: byte; kq:string; Begin Nho:=0; kq:=’’; if length(st1) < length(st2) then j:=length(st1) Else j:=length(st2); For i:=1 to j Begin Kq:=kq+so_chu((chu_so(st1[i])+chu_so(st2[i])+du)mod 10); Du:= (chu_so(st1[i])+chu_so(st2[i])+du) div 10; End; If length(st1)=length(st2) then Kq:=kq +so_chu(du) Else If length(st1) < length(st2) then For i:=j+1 to length(st2) Begin Kq:=kq+so_chu((chu_so(st2[i])+du)div 10); Du:= (chu_so(st2[i])+du)mod 10; End Else For i:=j+1 to length(st1) Begin Kq:=kq+so_chu((chu_so(st1[i])+du)div 10); Du:= (chu_so(st1[i])+du)mod 10; End; cong_xau:=kq; End; Giải thuật trừ: Giống cộng, thực từ phải qua trái Với lần trừ, đề phòng chữ số số bị trừ nhỏ nên ta vay tạm chục Nếu lần trước vay lần phải trừ Nhưng đáng vay kết sau trừ bé 10, lớn 10 vay Dưới ta xem a >= b: Function tru_kt(a,b:char; var nho:byte):char; Var K:byte; Begin If ord(a) >= ord(b) +nho then Begin k:=ord(a)- ord(b)-nho; nho:=0; End Else Begin k:=ord(a)- ord(b)+10-nho; nho:=1; End; Tr_kt:=chr(k+48); End; Function tru_xau(a,b:string):string; Var Kq:string; Ch:char; I:byte; Begin Kq:=’’;nho:=0; For i:=1 to length(b) Kq:=kq+tru_kt(a[i],b[i],nho); For i:=length(b)+1 to length(a) Begin Ch:=’0’; Kq:=kq+tru_kt(a[i],ch,nho); End; I:=length(kq); While kq[i] =’0’ Begin Delete(kq,I,1); I:=length(kq); End; tru_xau:=kq; End; Giải thuật nhân: Thông thường, nhân a với b, thực từ phải qua trái Mỗi lần nhân chữ số b với số a đặt kết dịch sang trái chữ số Nhưng lần lại nhân chữ số a với chữ số nói b Cũng phép cộng, kết phụ thuộc việc nhớ lần nhân trước xác định giá trị nhớ Việc nhận thực từ trái qua phải Function nhan_xau_kt(a:string; b:char):string; Var I,nho,tam:byte; Kq:string; Begin Kq:=’’; nho:=0; For i:=1 to length(a) Begin Kq:=kq+so_chu((chu_so(a[i])*chu_so(ch)+nho)mod 10); Nho:= (chu_so(a[i])*chu_so(ch)+nho)div 10; End; If nho0 then kq:=kq+so_chu(nho); nhan_xau_kt:=kq; End; Function nhan_xau_xau(a,b:string):string; Var Kq,kq1,kq2: string; Begin (*Giả sử xâu a có chiều dài lớn xâu b Việc xâu a có chiều dài nhỏ xâu b cần đảo thứ tự lời gọi Như làm giảm đáng kể số lượng phép toán thực hiện*) Kq:=nhan_xau_kt(a,b[1]); For i:=2 to length(b) Begin Kq1:=’0’; Kq2:=kq1+nhan_xau_kt(a,b[i]); Kq1:=kq1+’0’; Kq:=cong_xau(kq2,kq); End; Nhan_xau_xau:=kq; End; Giải thuật chia: Thông thường, chia a với b, thực từ trái qua phải Lần lấy nhóm có số chữ số số chữ số b, lần sau hạ số xuống phần dư Thay nhẩm xem lần, việc thử từ đến Vì lưu ngược nên ta thực từ phải qua trái Hàm sau thực chia a cho b, đặt kết vào c phần dư vào r Function kt_xau(a,b:string):boolean; Var Kt:boolean; I:byte; Begin If length(a) < length(b) then Kt:=true Else Begin If length(a)=length(b) then Begin I:=1; While (a[i]=b[i]) and (i

Ngày đăng: 20/02/2021, 10:57

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN

w