1. Trang chủ
  2. » Thể loại khác

SÁNG KIẾN KINH NGHIỆM“PHƯƠNG PHÁP GIẢI CÁC BÀI TOÁN VỀ ƯỚC CHUNG LỚN NHẤT VÀ BỘI CHUNG NHỎ NHẤT TRONG BỒI DƯỠNG HỌC SINH GIỎI TIN HỌC LỚP 8, 9”

23 7 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 23
Dung lượng 163,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ví dụ về kết hợp câu lệnh lặp và mảng một chiều để giải một số bài toán về Ước chung lớn nhất và Bội chung nhỏ nhất...8 2.4... Theo kinh nghiệm bản thân, tôi nhận thấy dạng bài ước chung

Trang 1

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

Trang 2

Quảng Bình, tháng 11 năm 2017

Trang 3

CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM

Độc lập – Tự do – Hạnh phúc

“PHƯƠNG PHÁP GIẢI CÁC BÀI TOÁN VỀ ƯỚC CHUNG LỚN NHẤT VÀ BỘI CHUNG NHỎ NHẤT TRONG BỒI DƯỠNG HỌC SINH GIỎI

TIN HỌC LỚP 8, 9”

Họ tên: Vương Công Quang

Chức vụ: Giáo viên

Đơn vị công tác: Trường THCS Phú Thủy

Trang 4

Quảng Bình, tháng 11 năm 2017

Trang 5

MỤC LỤC

MỤC LỤC 1

MỞ ĐẦU 2

1 Lý do chọn đề tài 2

2 Điểm mới sáng kiến 3

3 Phạm vi nghiên cứu 3

NỘI DUNG 3

1 Thực trạng nội dung cần nghiên cứu 3

1.1 Cơ sở khoa học về ước chung lớn nhất và bội chung nhỏ nhất: 3

1.2 Thực trạng dạy học: 4

2 Các giải pháp thực hiện 5

2.1 Hướng dẫn cho học sinh nắm lại kiến thức cơ bản về ước chung, ước chung lớn nhất, bội chung nhỏ nhất của hai hay nhiều số 5

2.2 Giới thiệu các thuật toán tìm ước chung lớn nhất và bội chung nhỏ nhất cho học sinh 6

2.3 Ví dụ về kết hợp câu lệnh lặp và mảng một chiều để giải một số bài toán về Ước chung lớn nhất và Bội chung nhỏ nhất 8

2.4 Áp dụng giải một số bài toán tìm ước chung, ước chung lớn nhất, bội chung nhỏ nhất 10

2.5 Hiệu quả của đề tài: 14

KẾT LUẬN 17

1 Ý nghĩa của thuật toán tìm UCLN, BCNN 17

2 Kiến nghị 18

TÀI LIỆU THAM KHẢO 19

Trang 6

MỞ ĐẦU

1 Lý do chọn đề tài

Ngày nay, với sự phát triển nhảy vọt của công nghệ thông tin và Tin học đãlàm thay đổi mọi mặt của đời sống xã hội, thúc đẩy sự phát triển của giáo dục,kinh tế, chính trị và mọi mặt đời sống xã hội Chính vì xác định được tầm quantrọng đó nên môn Tin học được đưa vào giảng dạy ở tất cả các lớp của các cấphọc, đặc biệt việc dạy học lập trình căn bản được chú trọng và áp dụng cho họcsinh khối 8 trở lên Đây là môn học mới mẻ nhưng rèn luyện cho học sinh tính

tư duy, làm việc logic, có tính sáng tạo, biết phân tích, tổng hợp và giúp giảiquyết được nhiều công việc xuất phát từ thực tiễn cuộc sống

Mặc dù vậy, qua thực tế chung thì các học sinh khi học môn Tin học 8 nóichung và BD HSG Tin học 8 và 9 nói riêng đều cảm thấy khó khăn trong nắmbắt kiến thức hoặc khó khăn trong việc tư duy thuật toán, giải quyết vấn đề, cáchgiải một số bài toán cơ bản còn rập khuôn chưa mang tính sáng tạo Nguyênnhân những vấn đề trên là do môn học lập trình còn mới mẻ với các em họcsinh; các thuật ngữ, các câu lệnh mang tính kỹ thuật, các từ khóa lập trình, giaodiện phần mềm đều là tiếng Anh nên việc tiếp xúc và làm quen với học sinh cònkhó khăn và bỡ ngỡ Đa số các em chưa có kinh nghiệm trong việc thể hiệnthuật toán, tìm hiểu chương trình nên việc viết chương trình còn đơn giản hoặckhông hiểu được chương trình người khác viết vì vậy khả năng nâng cao sự hiểubiết về các cách giải bài toán cũng như sự học hỏi thuật toán còn hạn chế

Trong chương trình khung bồi dưỡng Tin học 8 của Phòng giáo dục, có bàitập về số học gắn liền với Toán học phần Đại số lớp 6, 7, 8, một số bài toántrong đó được định nghĩa lại gắn liền với thực tiễn cuộc sống hơn Để giải quyếtmột bài toán xuất phát từ thực tiễn cuộc sống đòi hỏi học sinh cần có kỹ năngphân tích bài toán, rút ra cách giải cũng là rèn luyện cách phân tích tổng hợptrong tư duy để có thể đưa bài toán thực tiễn trở thành bài toán dạng số học đơnthuần và có thể giải quyết nó Vậy nên giáo viên cần dạy cho học sinh phát triển

tư duy về quy trình giải một bài toán, phát triển thuật toán và áp dụng kiến thứctổng hợp về câu lệnh có cấu trúc và kiểu dữ liệu để viết các chương trình giảicác bài toán Theo kinh nghiệm bản thân, tôi nhận thấy dạng bài ước chung lớnnhất, bội chung nhỏ nhất phù hợp để hướng dẫn học sinh hiểu cách chuyển từkiến thức phần số học sang áp dụng giải các bài toán trong lập trình Pascal từ cơbản đến nâng cao, từ bài toán định nghĩa đơn giản đến vận dụng các câu lệnh cócấu trúc và các kiểu dữ liệu để giải các bài khó nên tôi đã đúc rút lại thành sáng

kiến kinh nghiệm có thể áp dụng giảng dạy ngay tại đơn vị, đó là: “Phương pháp giải các bài toán về Ước chung lớn nhất và Bội chung nhỏ nhất trong bồi dưỡng học sinh giỏi Tin học lớp 8, 9”

Trang 7

2 Điểm mới sáng kiến

- Giáo viên có thể chuyển tải kiến thức lý thuyết trong số học dạng bài vềước chung lớn nhất, bội chung nhỏ nhất thành bài toán lập trình trong Pascal,phát triển vận dụng bài toán từ định nghĩa kết hợp với câu lệnh có cấu trúc, kiểu

dữ liệu mảng để tạo thành những bài toán nâng cao đòi hỏi học sinh có kĩ năngvận dụng tổng hợp các kiến thức đã học để giải

- Hình thành được cho học sinh phương pháp giải quyết các dạng bài toánước chung lớn nhất, bội chung nhỏ nhất từ cơ bản đến phức tạp

- Học sinh hình thành các kĩ năng vận dụng kiến thức để phân tích bài toán,giải bài toán một cách có hệ thống

- Giải pháp mới này ngắn gọn và dễ hiểu, phù hợp với học sinh lớp 8 trởlên, có thể ứng dụng trong dạy học đại trà và bồi dưỡng học sinh giỏi Tin họccủa bậc học

NỘI DUNG

1 Thực trạng nội dung cần nghiên cứu

1.1 Cơ sở khoa học về ước chung lớn nhất và bội chung nhỏ nhất:

1.1.1 Tìm ước chung lớn nhất

Trong Toán học, ước chung lớn nhất của hai số nguyên dương được tínhbằng thuật toán Euclid (thuật toán Euclid do nhà Toán học Euclid viết ra trong

cuốn sách toán nổi tiếng Elements từ khoảng năm 300 trước Công Nguyên) bằng

hai phương pháp: phương phương pháp trừ và phương pháp chia lấy số dư

Phương pháp trừ: Nguyên lý chính của thuật toán là ước số chung lớn nhấtcủa một cặp số không thay đổi với hiệu của hai số đó Ví dụ như ƯSCLN của

252 và 105 chính bằng ƯSCLN của 147 (= 252 − 105) và 105 Vì số lớn hơntrong cặp số bị giảm giá trị nên việc lặp đi lặp lại thuật toán này giúp tạo ranhững số ngày càng nhỏ và đến một lúc nào đó quá trình này sẽ kết thúc — khi

Trang 8

cặp số còn lại hai số bằng nhau (nếu quá trình được thực hiện thêm một bướcnữa, sẽ có một trong hai số trở thành số 0).

Phương pháp chia lấy số dư: Với hai số nguyên dương ban đầu có thể tạo

ra một cặp số nguyên dương mới bao gồm số nhỏ hơn và phần dư của phép chiahai số ban đầu Quá trình được tiếp tục cho đến khi hai số trong cặp bằng nhau,giá trị lúc đó sẽ trở thành ước số chung lớn nhất của cặp số ban đầu

Ví dụ: Tính ước số chung lớn nhất của 91 và 287

Trước hết lấy 287 (số lớn hơn trong 2 số) chia cho 91:

287 = 91*3 + 14 (91 & 14 sẽ được dùng cho vòng lặp kế)

Nhận xét: bất kỳ số nào chia hết bởi 287 và 91 cũng sẽ chia hết bởi 287 91*3 = 14 Tương tự, số chia hết bởi 91 và 14 cũng chia hết bởi 91*3 + 14 =

-287 Do đó, ƯSCLN(91,287) = ƯSCLN(91,14) Bài toán trở thành tìmƯSCLN(91,14) Lặp lại quy trình trên cho đến khi phép chia không còn số

dư như sau:

91 = 14*6 + 7 (14 & 7 sẽ được dùng cho vòng lặp kế)

14 = 7*2 (không còn số dư, kết thúc, nhận 7 làm kết quả)

Cuối cùng ta có: 7 = ƯSCLN(7,0) = ƯSCLN(14,7) = ƯSCLN(91,14) =ƯSCLN(287,91)

1.1.2 Tìm bội chung nhỏ nhất (BCNN)

Tìm bội chung nhỏ nhất của hai số nguyên a và b bằng công thức:BCNN(a,b) = (a * b) div UCLN(a,b)

Ví dụ: BCNN(4,6) = 4*6 div UCLN(4,6) = 24 div 2 = 12

1.1.3 Tìm UCLN, BCNN của nhiều số.

Để tìm ước chung lớn nhất và bội chung nhỏ nhất của hai hay nhiều số, ta

sử dụng công thức truy hồi:

Trang 9

rút ra công thức và viết chương trình chạy, một số em viết được chương trìnhgiải nhưng chỉ tìm được ước chung lớn nhất của hai số Đề khảo sát học sinhgiỏi lớp 8 sau khi dạy xong các chuyên đề lý thuyết và bài tập số học như sau:

Đề ra: Dùng ngôn ngữ lập trình Free Pascal hoặc Turbo Pascal để giải các

bài toán sau, thời gian làm bài 120 phút

Câu 1 (3 điểm): Nhập vào hai số nguyên dương a và b (0 < a,b < 32000).

Tính tổng các ước chung của hai số đó và in ra màn hình tổng đó

Câu 2 (3 điểm): Nhập vào hai số nguyên a và b (b≠ 0, 0<a,b<32000) In ra

phân số b a dưới dạng rút gọn phân số tối giản

Câu 3: (4 điểm): Em hãy nhập vào N số nguyên dương Ai (0 < N < 200; 0

<Ai < 32000), in ra màn hình ước chung lớn nhất của các số nguyên đó

Kết quả thống kê như sau:

1 và ở câu 2 đã khai báo, nhập được dữ liệu vào, viết được các lệnh để tìm ướcchung lớn nhất của hai số nhưng do không gán giá trị trung gian của a và b trongquá trình tìm ước nên sau khi tìm ước xong thì giá trị a và b đã bị thay dổidẫnđến kết quả bị sai, còn câu 3 chưa tìm được cách để tìm được ước chung lớnnhất của dãy số và chương trình chưa chạy được Đối với học sinh đạt kết quảkhá thì viết được chương trình câu 1 và 2 hoàn chỉnh, chạy được và cho kết quả

là ước chung lớn nhất của hai số, chưa vận dụng được kiến thức câu lệnh lặp vàmảng để giải quyết bài toán câu 3 Vì vậy, cần phải hướng dẫn cho học sinh nắmđược cách giải quyết bài toán theo hướng đơn giản hơn, hiệu quả hơn, từ cơ bảnđến nâng cao

Trang 10

- Ước và bội: nếu số nguyên a chia hết cho số nguyên d thì số d được gọi làước của số nguyên a, a được gọi là bội của d Số 0 không có bội số và mọi sốnguyên đều là ước số của số 0.

- Ước chung, ước chung lớn nhất: Số nguyên dương d lớn nhất là ước của

cả hai số nguyên a, b được gọi là ước số chung lớn nhất (ƯCLN) của a và b.Trong trường hợp cả hai số nguyên a và b đều bằng 0 thì chúng không có ƯCLN

vì khi đó mọi số tự nhiên khác không đều là ước chung của a và b Nếu chỉ mộttrong hai số a hoặc b bằng 0, số kia khác 0 thì ƯCLN của chúng bằng giá trịtuyệt đối của số khác 0

2.2 Giới thiệu các thuật toán tìm ước chung lớn nhất và bội chung nhỏ nhất cho học sinh

2.2.1 Thuật toán tìm ước chung của hai số:

Với a và b là hai số nguyên không âm thì xảy ra ba trường hợp:

Trường hợp 1: cả a và b là số 0 thì danh sách các ước chung không liệt kêđược hết bởi vì mọi số tự nhiên lớn hơn 0 là ước của số 0

Trường hợp 2: nếu a hoặc b có một số là số 0 thì ước chung của hai số làcác ước của số khác 0

Trường hợp 3: cả hai số nguyên dương thì xét tìm các ước nằm trong đoạn

từ số 1 đến một nữa của số nhỏ hơn, cụ thể đoạn lệnh in ra các ước chung của a

và b như sau:

If a > b then min :=b else min :=a ;

For i:= 1 to min div 2 do if ((a mod i = 0) and (b mod i = 0)) then write(i:3);

Nhận xét: lấy mốc tìm là một nửa số nhỏ hơn giúp rút ngắn thời gian tìmước chung của hai số

2.2.2 Thuật toán tìm ước chung lớn nhất của hai số

- Thuật toán 1: Phương pháp trừ

Với a và b là hai số nguyên ta có đoạn lệnh chính tìm UCLN là

While a <> b do if a > b then a := a – b else b := b – a ; Ucln := a ; {Ước chung lớn nhất là a hoặc b}

+ Ưu điểm: Tìm được ước chung của các số nguyên dương

+ Nhược điểm: Nếu a hoặc b là số 0 thì đoạn lệnh trên sẽ gây lặp vô hạnlần, đồng nghĩa là không tìm được ước chung lớn nhất; ngoài ra thuật toán nàythực hiện còn khá nhiều lần (lâu) nếu a và b chênh lệch giá trị lớn

Trang 11

+ Phương án khắc phục: Kiểm tra các số a và b phải lớn hơn 0 trước khitìm ước chung lớn nhất.

- Thuật toán 2: Phương pháp chia lấy số dư

While b <> 0 do begin r := a mod b ; a := b; b := r ; end;

Ucln := a ; {Ước chung lớn nhất là a}

+ Ưu điểm: Tìm được ước chung lớn nhất của hai số nguyên bao gồm mộttrong hai số là số 0 Tốc độ tìm nhanh hơn thuật toán 1 nêu trên vì vậy thuật toánnày thường được sử dụng để tìm ước chung lớn nhất của hai số nguyên

+ Nhược điểm: Nếu cả hai số a và b đều là số 0 thì kết quả tìm ước chunglớn nhất cho giá trị là số 0 Nhưng theo định nghĩa về ước thì số 0 không có ướclớn nhất nên sẽ không tìm được ước chung lớn nhất của hai số 0

+ Phương án khắc phục: Kiểm tra đầu vào các số a và b phải có ít nhấtmột số khác số 0 rồi mới tìm ước chung lớn nhất

2.2.3 Thuật toán tìm bội chung nhỏ nhất của hai số

Để tìm bội chung nhỏ nhất của hai số nguyên dương ta tìm ước chung lớnnhất của hai số đó, sau đó lấy tích của hai số đó rồi chia lấy phần nguyên choước chung lớn nhất tìm được Gọi BCNN(a,b) và UCLN(a,b) là bội chung nhỏnhất của a và b và ước chung lớn nhất của a và b thì ta có: BCNN(a,b) = a*b divUCLN(a,b) Đoạn lệnh chính tìm bội chung nhỏ nhất của hai số nguyên dương a

và b là:

x := a; y := b ; While y <> 0 do begin r := x mod y ; x := y; y := r ; end;

Ucln := x; {Ước chung lớn nhất là x}

Bcnn := a*b div ucln ;

Lưu ý rằng cần kiểm tra các số a và b phải nguyên dương trước bởi vì nếu ahoặc b là số 0 thì không tìm được bội chung nhỏ nhất bởi theo định nghĩa số 0không có bội

2.2.4 Thuật toán tìm ước chung lớn nhất và bội chung nhỏ nhất của nhiều số

Để làm việc trên một dãy số hoặc nhiều số, ta lưu các số đó vào mảng mộtchiều sau đó sử dụng công thức truy hồi để tìm ước chung lớn nhất và bội chungnhỏ nhất theo cách sau:

UCLN(a,b,c) = UCLN(UCLN(a,b),c)

BCNN(a,b,c) = BCNN(BCNN(a,b),c)

Trang 12

Cụ thể, dùng câu lệnh lặp và viết một hàm tìm ước chung lớn nhất của hai

số và hàm tìm bội chung nhỏ nhất của hai số, sau đó dùng công thức truy hồinhư sau:

Function ucln(a,b: integer): integer;

begin

x := a; y := b ; While y <> 0 do begin r := x mod y ; x := y; y := r ; end; Ucln := x; {Ước chung lớn nhất là x}

end;

function bcnn(a,b : integer):integer;

begin Bcnn := a*b div ucln(a,b) ; end;

Ucmax := a[1]; bcmax:=a[1];

For i:=2 to N do begin

ucmax := ucln(ucmax,a[i]);

bcmax:=bcnn(bcmax,a[i]);

end;

2.3 Ví dụ về kết hợp câu lệnh lặp và mảng một chiều để giải một số bài toán

về Ước chung lớn nhất và Bội chung nhỏ nhất

Việc kết hợp câu lệnh có cấu trúc là câu lệnh lặp và kiểu dữ liệu mảng mộtchiều xảy ra khi bài toán tìm ước chung lớn nhất và bội chung nhỏ nhất của mộtdãy số hoặc dãy phân số, phân thức cho trước Sử dụng mảng một chiều để lưucác số vào mảng và dùng câu lệnh lặp để duyệt mảng mới xử lý

Để sử dụng mảng ta khai báo mảng ở phần khai báo, nếu bài toán là dãy sốthì chỉ cần khai báo một mảng chứa dãy số, nếu bài toán là dãy phân số thì cầnkhai báo hai mảng để chứa tử và mẫu của các phân số Cú pháp khai báo mảngnhư sau:

Var tên mảng : array[<chỉ số đầu> <chỉ số cuối>] of <kiểu dữ liệu>;

Ví dụ: Var a : array[1 200] of integer;

Tu, mau : array[1 200] of longint ;Đối với câu lệnh lặp, thông thường sử dụng câu lệnh lặp với số lần biếttrước bởi vì các bài toán thường cho biết trước số phần tử của dãy số, dãy phân

số Có hai dạng câu lệnh lặp với số lần biết trước, đó là:

Trang 13

For <biến đếm> := <giá trị đầu> to <giá trị cuối> do <câu lệnh> ;

For <biến đếm> := <giá trị cuối> downto <giá trị đầu> do <câu lệnh> ;

Việc sử dụng câu lệnh lặp dùng để nhập số lượng phần tử hoặc dựa vào quyluật của dãy số mà đưa các số, tử hoặc mẫu của các phân số lưu vào mảng sau

đó tìm ước chung lớn nhất và bội chung nhỏ nhất theo yêu cầu của bài

2

1 2

6

5 4

3 2

Phân tích bài toán: Các phân số trong phép toán trên có quy luật chung, tử

số luôn là các số lẻ đại diện bằng công thức 2n-1 và mẫu luôn là các số chẵn, đạidiện bằng công thức là 2n Dãy số có n phân số nên ta sẽ lặp lại n phép cộng cácphân số với nhau nên trong chương trình sẽ dùng câu lệnh lặp với số lần biếttrước để viết đoạn lệnh tính toán Trong toán học, các bước để tính toán và rútgọn tổng các phân số được thực hiện như sau:

+ Bước 1: Tìm mẫu chung của các mẫu số

+ Bước 2: Lấy mẫu chung chia cho các tử riêng để lấy nhân tử phụ, sau

đó lấy nhân tử phụ nhân với tử riêng tạo thành tử mới của mỗi phân số

+ Bước 3: Tính tổng các tử và giữ nguyên mẫu

+ Bước 4: Tìm ước chung lớn nhất của tử và mẫu

+ Bước 5: Rút gọn cả tử và mẫu bằng cách cùng chia cho ước chung lớnnhất ta có phân số tối giản cần tìm

Áp dụng phương pháp đó để giải bài toán này trong lập trình, trình tự cácbước vẫn giữ nguyên Việc tìm mẫu chung chính là tìm bội chung nhỏ nhất củacác mẫu, để tìm bội chung nhỏ nhấ ta phải tìm ước chung lớn nhất các mẫu,trong trường hợp này để tránh viết nhiều đoạn lệnh tìm ước chung lớn nhất vàbội chung nhỏ nhất ta nên viết chương trình con tìm ước chung lớn nhất để sửdụng cho gọn trong chương trình Hơn nữa, ta cần lưu các tử và mẫu phân số lại

để tính toán thực hiện ở các bước 1 đến bước 3 nên ta dùng mảng để lưu các tử

và mẫu theo từng cặp chỉ số thứ tự ở hai mảng khác nhau có cùng số lượng phầntử

Chương trình như sau: (Turbo Pascal)

Program Rut_gon_day_so ;

Var tu, mau : array[1 200] of integer ;

i, N: byte ;tem, A, B : longint;

function tim_ucln(x, y : integer): integer;

var r : longint ;

begin

while y <>0 do begin r := x mod y ; x := y; y := r; end;

Ngày đăng: 12/02/2022, 01:08

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w