1. Trang chủ
  2. » Giáo án - Bài giảng

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

21 107 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 21
Dung lượng 267,04 KB

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

Nội dung

Mục tiêu nghiên cứu của sáng kiến kinh nghiệm là 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ăng vậ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ọc của bậc học.

Trang 1

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”

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

Trang 2

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

Trang 3

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 4

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 quan trọ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ấp họ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ọc sinh 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ải quyế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ói chung và BD HSG Tin học 8 và 9 nói riêng đều cảm thấy khó khăn trong nắm bắ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ách giả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ên nhâ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ọc sinh; 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, giao diệ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òn khó khăn và bỡ ngỡ Đa số các em chưa có kinh nghiệm trong việc thể hiện thuậ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ặc khô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ểu biế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ài tậ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án trong đó đượ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ết mộ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ăng phâ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ợp trong 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 đơn thuầ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ức tổ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ải cá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ớn nhấ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 5

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ăng vậ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ọc củ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ính bằ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ất củ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ơn trong 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 ra nhữ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 6

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ước nữ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 chia hai 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 7

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ình giải nhưng chỉ tìm được ước chung lớn nhất của hai số Đề khảo sát học sinh giỏ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 ước chung lớn nhất của hai số nhưng do không gán giá trị trung gian của a và b trong quá 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ớn nhấ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

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

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ố

Trang 8

Trong phần Số học lớp 6 có bài về ước và bội, ước chung, ước chung lớn nhất và bội chung nhỏ nhất, theo đó các định nghĩa được nêu ra như sau:

- Ướ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ột trong 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

Trang 9

+ 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ạn lần, đồng nghĩa là không tìm được ước chung lớn nhất; ngoài ra thuật toán này thự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

+ 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 khi tì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ột trong 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án nà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 chung lớn nhất cho giá trị là số 0 Nhưng theo định nghĩa về ước thì số 0 không có ước lớ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ất mộ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ớn nhấ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 div UCLN(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 a hoặc b là số 0 thì không tìm được bội chung nhỏ nhất bởi theo định nghĩa số 0 khô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ố

Trang 10

Để 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ột chiều sau đó sử dụng công thức truy hồi để tìm ước chung lớn nhất và bội chung nhỏ nhất theo cách sau:

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

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

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ồi như 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ột chiề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ột dã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ưu cá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ần khai 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ảng như sau:

Trang 11

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ết trướ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à:

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 quy luậ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

Ví dụ bài toán: Cho

n

n S

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, đại diệ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ác phâ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ết trướ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út gọ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ớn nhấ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ác bướ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ủa cá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ần

tử

Ngày đăng: 03/10/2021, 13:32

TỪ KHÓA LIÊN QUAN

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