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

Skkn kĩ thuật lập trình đối với số nguyên lớn trong công tác bồi dưỡng học sinh giỏi tại trường trung học phổ thông vinh xuân

45 1 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

PHẦN I PHẦN I ĐẶT VẤN ĐỀ 1 Lý do chọn đề tài Trong quá trình đào tạo bồi dưỡng học sinh giỏi ở trường phổ thông, chúng tôi nhận thấy khả năng số học đối với số nguyên lớn của ngôn ngữ lập trình Free P[.]

PHẦN I ĐẶT VẤN ĐỀ Lý chọn đề tài Trong trình đào tạo bồi dưỡng học sinh giỏi trường phổ thông, nhận thấy khả số học số nguyên lớn ngôn ngữ lập trình Free Pascal biểu diễn số ngun có hàng chục nghìn chữ số đến hàng trăm nghìn chữ số gây nhiều khó khăn cho học sinh Nhằm khắc phục nhược điểm để đáp ứng yêu cầu công tác bồi dưỡng học sinh giỏi thầy trò trường trung học phổ thông Vinh Xuân, mạnh dạn nghiên cứu đề tài “KĨ THUẬT LẬP TRÌNH ĐỐI VỚI SỐ NGUYÊN LỚN TRONG CÔNG TÁC BỒI DƯỠNG HỌC SINH GIỎI TẠI TRƯỜNG TRUNG HỌC PHỔ THƠNG VINH XN” nhằm phục vụ cơng tác bồi dưỡng học sinh giỏi có hiệu Mục đích nghiên cứu - Hệ thống hóa sở lý thuyết lập trình số nguyên lớn - Xây dựng cơng cụ lập trình số nguyên lớn nhằm hỗ trợ cho hoạt động dạy học thầy trò nhà trường trình tiếp xúc làm việc với số nguyên lớn - Trên sở nghiên cứu, từ đưa nhận xét, đánh giá đề xuất giải pháp góp phần hồn thiện cơng tác dạy học lập trình tốn mà liệu vào hay kết có giá trị nguyên dương lớn Đối tượng nghiên cứu Kỹ thuật lập trình số ngun lớn cơng tác dạy học bồi dưỡng thầy trò trường THPT Vinh Xuân Phạm vi nghiên cứu Tập hợp số nguyên dương lớn hệ thống tập có liệu vào hay kết kiểu số nguyên dương có giá trị lớn Phương pháp nghiên cứu - Phương pháp nghiên cứu sở lý luận - Phương pháp thu thập tài liệu - Phương pháp xử lý số liệu lập trình skkn - Phương pháp thực nghiệm - Phương pháp điều tra phát vấn Kết cấu đề tài Phần I Đặt vấn đề Phần II Nội dung kết nghiên cứu Chương Cơ sở lý luận lập trình số nguyên lớn Chương Giải pháp cho số toán số nguyên lớn Phần III Kết luận skkn PHẦN II NỘI DUNG VÀ KẾT QUẢ NGHIÊN CỨU Chương CƠ SỞ LÝ LUẬN VỀ LẬP TRÌNH VỀ SỐ NGUYÊN LỚN 1.1 TỔ CHỨC KIỂU DỮ LIỆU MẢNG MỘT CHIỀU BIỂU DIỄN SỐ NGUYÊN LỚN Trong thực tế có tốn số học có giá trị lớn từ hàng chục nghìn đến hàng trăm nghìn chữ số, khả biểu diễn lưu trữ kiểu liệu chuẩn Free Pascal hữu hạn nên khơng thể đáp ứng tốn số học có giá trị lớn Từ chúng tơi xây dựng mảng chiều có 1.000.001 phần tử, phần tử biểu diễn hay số chữ số số nguyên lớn Trong phần lý thuyết, khai báo mảng chiều phần tử biểu diễn chữ số số nguyên lớn, khai báo sau: Const Hang_so = 1000000; Type Big_Number = Array[0 Hang_so] of Longint; Var A: Big_Number; đó: + Chữ số hàng đơn vị số nguyên lớn biểu diễn phần tử A[1.000.000] + Chữ số hàng chục số nguyên lớn biểu diễn phần tử A[999.999] + ……… + Chữ số hàng cao số nguyên lớn biểu diễn phần tử A[i] giá trị i quản lý giá trị phần tử A[0] Với số nguyên lớn A = 876328 biểu diễn phần tử mảng quản lý giá trị A[0] sau: A 999.995 0 0 8 …… 999.995 999.996 999.997 999.998 999.999 1.000.000 Với A := viết: Fillchar(A, Sizeof(A),0); A[0]:= Hang_So; Với A := viết: Fillchar(A,Sizeof(A),0); A[0]:= Hang_So; A[Hang_so]:=1; skkn Trên sở biểu diễn số nguyên lớn vậy, chúng tơi xây dựng phép tốn tập hợp số nguyên dương lớn phép toán quan hệ, phép toán cộng, phép trừ, phép nhân, phép chia lấy phần nguyên (Div), phép chia lấy phần dư (Mod) ứng dụng phép tốn để giải số tốn cơng tác bồi dưỡng học sinh giỏi 1.2 PHÉP TỐN QUAN HỆ 1.2.1 Phép tốn so sánh * Thuật toán: Hai số nguyên dương lớn A B kiểu Big_number biểu diễn mảng chiều, phần tử mảng biểu diễn chữ số số nguyên lớn Ta dựa vào giá trị A0, B0, Ai với A0 ≤ i ≤ Hang_so Bk với B0 ≤ k ≤ Hang_so để thực so sánh trả giá trị True False Function Bằng(A,B:Big_number): Boolean Begin Nếu A0 B0 Bằng:=false Ngược lại { + i:= A0; Trong (i ≤ Hang_so) (Ai = Bi) làm i:= i+1; + Bằng:= i > Hang_so;} End; * Chương trình Function Bang(A,B:Big_Number):Boolean; Var I:Longint; Begin If A[0]B[0] Then Bang:=False Else Begin I:=A[0]; While (IHang_So; End; End; 1.2.2 Phép toán so sánh lớn * Thuật toán: So sánh hai số A, B: Big_Number; A lớn B trả kết True khơng trả giá trị False skkn Function Lớn_hơn(A,B:Big_number):Boolean Begin Nếu A0 < B0 Lớn_hơn:= true Ngược lại Nếu A0 > B0 Lớn_hơn:= false Ngược lại { + i:= A0; + Trong (i Hang_so Lớn_hơn:= False ngược lại i:= Ai > Bi} End; * Chương trình Function Lon_Hon(A,B:Big_Number):Boolean; Var I:Longint; Begin If A[0]B[0] Then Lon_Hon:=False Else Begin I:=A[0]; While (IHang_So Then Lon_Hon:=False Else Lon_Hon:=A[I]>B[I]; End; End; 1.2.3 Phép toán so sánh nhỏ * Thuật toán: So sánh hai số A, B: Big_Number; A nhỏ B trả kết True khơng trả giá trị False Function Nhỏ_hơn(A,B:Big_number):Boolean Begin * Nếu A0 < B0 Lớn_hơn:= False Ngược lại - Nếu A0 > B0 Lớn_hơn:= True Ngược lại skkn { + i:= A0; + Trong (i Hang_so Lớn_hơn:= False ngược lại i:= Ai0 Do Begin I:=I-1;C[I]:=K Mod 10;K:=K Div 10; End; C[0]:=I; End; 1.3.1.2 Cộng hai số nguyên lớn * Thuật toán: Phép cộng hai số nguyên dương lớn thực từ phải sang trái phần nhớ mang sang trái chữ số Procedure Cong_Max(Var C:Big_Number;A,B:Big_Number); Begin Fillchar(C,sizeof(C),0); Tg:= 0; Cho i:= Hang_so Min(A0, B0) làm {Tg:= Tg + Ai + Bi; Ci:= Tg Mod 10; Tg:= Tg Div 10} Nếu Tg = C0:= i Ngược lại {C0:= i -1; Ci-1:= Tg} End; * Chương trình Procedure Cong_Max(Var C:Big_Number;A,B:Big_Number); Var I,Min,Tg:Longint; Begin Fillchar(C,Sizeof(C),0); Tg:=0; If A[0]>=B[0] Then Min:=B[0] Else Min:=A[0]; For I:=Hang_So Downto Min Do Begin Tg:=Tg+A[I]+B[I]; C[I]:=Tg Mod 10; Tg:=Tg Div 10; End; If Tg=0 Then C[0]:= i Else Begin C[0]:= i - 1; C[i -1]:=Tg; End; End; skkn 1.3.2 Phép trừ 1.3.2.1 Trừ số nguyên lớn với số nguyên nhỏ * Thuật toán: Nếu A ≥ k C:= A – k khơng C:= – (k – A) Procedure Tru_Min(Var C:Big_Number; A:Big_Number; K:Longint); Begin Trường hợp A≥ k: C:= A – k Fillchar(c,sizeof(C),0); Tg:= Trong (k>0) (i≥ A0) làm {+ Tg:= k Mod 10; k := k Div 10; + Nếu Ai ≥ Tg Ci:= Ai – Tg Ngược lại {Ci:= Ai +10 – Tg; k:= k+1;} + I:= i + 1} Trong I ≥ A0 làm {Ci:=Ai; i:= i – 1} i:=A0; Trong (i0) And (I>=A[0]) Do Begin Tg:=K Mod 10; K:=K Div 10; If A[I]>=Tg Then C[I]:=A[I]-Tg Else Begin C[I]:=A[I]+10-Tg; K:=K+1; End; I:=I-1; End; skkn If K=0 Then Begin While I>=A[0] Do Begin C[I]:=A[I]; I:=I-1; End; I:=A[0]; While (I=A[0] Do Begin M:=M-A[I]*Lt; Lt:=Lt*10; I:=I-1; End; Fillchar(C,Sizeof(C),0); I:=Hang_So; While M>0 Do Begin C[I]:=M Mod 10; M:=M Div 10; I:=I-1; End; C[0]:=I+1; C[C[0]]:=-C[C[0]]; End; End; 1.3.2.2 Trừ hai số nguyên lớn * Thuật toán: Thực trừ chữ số từ trái sang phải giá trị vay mượn hàng cao nhớ biến Tg làm sở cho phép trừ hàng cao hơn; xét hai trường hợp A ≥ B A < B: Nếu A ≥ B C:= A – B khơng C:= – (B – A) Procedure Tru_Min(Var C: Big_Number; A,B: Big_Number); Begin Fillchar(C,sizeof(C),0); Ok:= A ≥ B; Nếu Ok { Tg:= 0; Cho i:= Hang_so A0 làm Nếu Ai ≥ Tg + Bi {Ci:= Ai – Bi – Tg; Tg:= 0;} Ngược lại {Ci:= Ai + 10 – Bi – Tg; Tg:= 1;} Trong (i< Hang_so) (Ci = 0) làm i:= i+1; C0:= i;} skkn Ngược lại { Tg:= 0; Cho i:= Hang_so B0 làm Nếu Bi ≥ Tg + Ai {Ci:= Bi – Ai – Tg; Tg:= 0;} Ngược lại {Ci:= Bi + 10 – Ci – Tg; Tg:= 1;} Trong (i< Hang_so) (Ci = 0) làm i:= i+1; C0:= i; Ci:= – Ci} End; * Chương trình Procedure Tru_Max(Var C:Big_Number;A,B:Big_Number); Var I,Tg:Longint; Ok:Boolean; Begin Fillchar(C,Sizeof(C),0); If A[0]B[0] Then Ok:=False Else Begin I:=A[0];While (IHang_So Then Ok:=False Else Ok:=A[I]>B[I]; End; If Ok Then Begin Tg:=0; For I:=Hang_So Downto A[0] Do If A[I]>=B[I]+Tg Then Begin C[I]:=A[I]-B[I]-Tg; Tg:=0 End Else Begin C[I]:=A[I]+10 - B[I] - Tg; Tg:=1; End; While (I

Ngày đăng: 09/02/2023, 14:06

Xem thêm:

w