1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Sử dụng kiến thức toán học trong lập trình giải một số bài toán nhằm tạo hứng thú và nâng cao kết quả học tập cho học sinh

18 26 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 18
Dung lượng 157,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

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ TRƯỜNG THPT TRIỆU SƠN 3 SÁNG KIẾN KINH NGHIỆM SỬ DỤNG KIẾN THỨC TOÁN HỌC TRONG LẬP TRÌNH GIẢI MỘT SỐ BÀI TOÁN NHẰM TẠO HỨNG THÚ VÀ NÂNG CAO KẾT QUẢ HỌC T

Trang 1

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ

TRƯỜNG THPT TRIỆU SƠN 3

SÁNG KIẾN KINH NGHIỆM

SỬ DỤNG KIẾN THỨC TOÁN HỌC TRONG LẬP TRÌNH GIẢI MỘT SỐ BÀI TOÁN NHẰM TẠO HỨNG THÚ VÀ NÂNG CAO KẾT QUẢ HỌC TẬP CHO HỌC SINH

Người thực hiện: Lê Thị Quỳnh Chức vụ: Tổ phó chuyên môn Đơn vị công tác: Trường THPT Triệu Sơn 3 SKKN thuộc môn: Tin học

THANH HOÁ NĂM 2021

Trang 2

MỤC LỤC

1 MỞ ĐẦU 1

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

1.2 Mục đích nghiên cứu 1

1.3 Đối tượng nghiên cứu 1

1.4 Phương pháp nghiên cứu 2

2 NỘI DUNG 3

2.1 Thực trạng của vấn đề cần giải quyết 3

2.2 Các giải pháp giải quyết vấn đề 3

2.2.1 Giải pháp 1: Sử dụng công thức tính tổng dãy số và giải phương trình bậc hai 3

2.2.2 Giải pháp 2: Sử dụng hai đẳng thức bằng nhau 5

2.2.3 Giải pháp 3: Sử dụng cách tìm chu vi nhỏ nhất của hình chữ nhật có diện tích cho trước 6

2.2.4 Giải pháp 4: Sử dụng tổ hợp, nhóm các phần tử cùng thỏa mãn điều kiện 7

2.2.5 Giải pháp 5: Sử dụng công thức truy hồi, đệ quy 9

3 KẾT LUẬN, KIẾN NGHỊ 13

3.1 Kết luận 13

3.2 Kiến nghị 13

TÀI LIỆU THAM KHẢO 14

DANH MỤC 15

Trang 3

1 MỞ ĐẦU

1.1 Lý do chọn đề tài.

Người ta thường nói Toán và Tin là anh em của nhau quả thật không sai

Để học tốt môn Tin học nói chung và lập trình Tin học nói riêng thì nhất định cần phải có tư duy và tố chất Toán học Có rất nhiều các bài toán Tin học (cấp THPT) có thể giải được bằng cách sử dụng các công thức toán học liên quan, nếu không có kiến thức Toán học thì khó có thể giải quyết hoặc giải quyết theo những cách ‘lòng vòng’ hơn rất nhiều

Quá trình dạy tại các lớp mũi nhọn và ôn thi HSG cấp Tỉnh, tôi đã vận dụng nhiều cách khác nhau để tạo hứng thú, sự yêu thích môn học cho học sinh, đồng thời cũng là cách để tìm ra những học sinh có đam mê, có tố chất môn Tin học, từ đó tìm kiếm được những học sinh dự nguồn tham gia thi học sinh giỏi cấp Tỉnh Một trong những cách đó là hướng dẫn cho các em giải một bài toán lập trình từ nhiều góc độ, trong đó có việc sử dụng kiến thức Toán học – kiến thức mà hầu hết các em học sinh khá giỏi đều rất muốn được vận dụng, được thể hiện trong giải quyết vấn đề của qua trình học tập các môn học Vì vậy, tôi đã

chọn đề tài “Sử dụng kiến thức Toán học trong lập trình giải một số bài toán nhằm tạo hứng thú và nâng cao kết quả học tập cho học sinh” làm sáng kiến

kinh nghiệm của mình trong năm học 2020 – 2021 để trao đổi với đồng nghiệp Đây là một phương pháp tôi đã thực hiện rất hiệu quả tại ngôi trường THPT Triệu Sơn 3, đồng thời cũng hy vọng cách làm này sẽ được hoàn thiện, bổ sung

và nhân rộng trong các trường THPT khác trong Tỉnh

1.2 Mục đích nghiên cứu.

Với lý do chọn đề tài đã trình bày ở trên, tôi mong muốn đề tài của mình

sẽ giúp đồng nghiệp có thể dễ dàng tạo hứng thú và sự yêu thích môn học cho học sinh khá giỏi (những học sinh định hướng học khoa học tự nhiên)

- Giảm khó khăn khi tìm kiếm học sinh dự nguồn thi học sinh giỏi cấp Tỉnh

- Nâng cao kết quả học tập cho học sinh định hướng học ban khoa học tự nhiên nói chung và học sinh lớp 11 nói riêng

- Nhìn nhận, giải quyết một số bài toán bằng cách sử dụng các kiến thức Toán học đã biết

1.3 Đối tượng nghiên cứu.

- Một số kiến thức Toán học

- Một số bài tập Tin học lớp 11(THPT) hoặc thi HSG các cấp

- Sự hứng thú, ý thức học tập của học sinh khá giỏi đối với môn Tin học

Trang 4

1.4 Phương pháp nghiên cứu.

Để thực hiện đề tài này, tôi đã sử dụng các phương pháp:

- Phương pháp nghiên cứu xây dựng cơ sở lí thuyết: Cơ sở lý thuyết là các kiến thức Toán học mà học sinh đã được biết hoặc đã học, một số bài toán trong các

đề thi các cấp; Sự hứng thú trong giờ học môn Tin học và ý thức học tập của học sinh đối với môn học

- Phương pháp điều tra khảo sát thực tế, thu thập thông tin: Thông qua kết quả điều tra mức độ hứng thú, yêu thích tìm hiểu môn Tin học của học sinh lớp 11 trường THPT Triệu Sơn 3

- Phương pháp thống kê, xử lý số liệu: Trên cơ sở các kết quả đạt được, thống

kê các số liệu, xử lí số liệu để so sánh giữa nhóm thực nghiệm và đối chứng

Trang 5

2 NỘI DUNG

2.1 Thực trạng của vấn đề cần giải quyết

Trong các bài tập lập trình Tin học cấp THPT hoặc nội dung thi học sinh giỏi Tin học các cấp, có nhiều bài thường có thể giải với nhiều cách khác nhau, trong đó có nhiều bài có thể giải quyết hoàn toàn bằng kiến thức Toán học Nhiều học sinh có thể học Toán và các môn khoa học tự nhiên rất tốt nhưng lại chưa biết vận dụng kiến thức đó trong bài toán lập trình như thế nào, nên các em thường kêu ca học Tin khó

Đối với nhóm học sinh khá giỏi thì việc học một nội dung nào đó có liên quan đến Toán học luôn tạo được sự tò mò, hứng thú và thích khám phá tìm hiểu của các em Vì vậy, trong mỗi tiết dạy (nhất là bài 4 – Tin học 10, và chương trình Tin học 11) tôi luôn tìm kiếm sự liên quan giữa Tin và Toán để tạo sự hứng thú, yêu thích tìm hiểu môn Tin học cho các em thông qua các bài tập ở mức độ phù hợp

2.2 Các giải pháp giải quyết vấn đề.

Mỗi bài toán nêu ra trong đề tài này là những ví dụ cho việc có thể thực hiện giải quyết bài toán bằng nhiều cách, trong đó có thể sử dụng các kiến thức Toán học mà học sinh đã biết Các bài toán được sắp xếp thứ tự theo mức độ từ

dễ đến khó hơn Với mỗi giải pháp, tôi chỉ đưa ra một hoặc hai bài toán minh họa, những nội dung Toán học liên quan khác sẽ tiếp tục được nghiên cứu và trình bày trong các đề tài tiếp theo Với mỗi bài toán đưa ra, tôi chỉ nêu ra các cách giải theo ý chủ quan, vẫn có thể còn những cách làm khác mà bản thân chưa biết đến, với những cách làm khác được nêu ra, tôi chỉ nêu cách làm, còn theo cách sử dụng các kiến thức, các công thức Toán học thì tôi sẽ nêu cách làm

và code bài bằng ngôn ngữ lập trình C++ Dữ liệu vào/ra của bài toán tôi để file

dạng “ input.txt ” và “output.txt”

2.2.1 Giải pháp 1: Sử dụng công thức tính tổng dãy số và giải phương trình bậc hai

Bài toán 1 : Số tam giác

Một số được gọi là “số tam giác” nếu ta có thể biểu diễn nó dưới dạng lưới hình tam giác gồm các điểm sao cho các điểm tạo thành một tam giác đều, tức là hàng đầu tiên có một điểm, hàng thứ hai có hai điểm, hàng thứ ba có ba điểm, Các số tam giác bắt đầu là 1, 3 (12), 6 (1+2+3),

Trang 6

Cho biết số nguyên dương N, cho biết N có phải là số tam giác hay không? (N ≤107) Dữ liệu vào gồm 1 dòng chứa số N, dữ liệu ra là số 1 nếu N là

số tam giác, và là số 0 nếu N không phải là số tam giác

Cách 1 Dùng tư duy toán học

Nhận xét:

Nếu N là số tam giác thì N sẽ có dạng: 1+2+3+ +k = k(k+1)/2

Giả sử N là số tam giác thì N = x(x-1)/2 hay ta có phương trình bậc 2 ẩn x là: x2+x-2*N =0 Nếu phương trình có nghiệm nguyên dương thì N là số tam giác, ngược lại thì không

Dưới đây là code tham khảo theo cách này

#include <bits/stdc++.h>

using namespace std;

int main()

{ ifstream cin("input.txt");

ofstream cout ("output.txt");

int n;

cin >> n;

int a = 1, b = 1, c = -2*n;

double d = b*b - 4*a*c;

double x1 = (-b+sqrt(d))/(2*a) ;

double x2 = (-b-sqrt(d))/(2*a);

if ((x1 > 0 && floor(x1)==x1) or ( x2 > 0 &&

floor(x2)==x2)) {

cout << "1\n" ;

}

else cout << "0\n" ;

return 0;

}

Cách 2 Dùng phép lặp để tìm một tổng S của k số nguyên dương đầu tiên, nếu

quá trình sinh tổng S mà S=N thì N đúng là số tam giác, nếu S>N thì N không phải là số tam giác

Bài toán 2: Tính tổng của dãy số

Cho số nguyên dương N Tính giá trị : f(N)= -1+2-3+ +N*(-1)N ,với N ≤109

Dữ liệu vào gồm một dòng chứa số nguyên dương n, dữ liệu ra là giá trị tính được của dãy số

Ý tưởng cho bài toán này:

Cách 1 Sử dụng các công thức Toán học sau:

Trang 7

G(n) = 1+2+3+ +n = n*(n+1) div 2;

H(n) = 1+3+5+ +(2*n-1) = n2 ;

F(n) = -1+2-3+4- +(-1)n*n ;

Với n chẵn, ta thấy F(n) = G(n) - 2*H(n/2) ;

Với n lẻ, ta thấy F(n) = G(n)-2*H(n/2)-n ;

Dưới đây là code tham khảo của bài toán theo cách này

#include <bits/stdc++.h>

#define lli long long

using namespace std;

int main()

{

ifstream cin("input.txt");

ofstream cout ("output txt");

lli n, n1;

cin>> n;

n1=(n % 2 ? n-1 : n);

lli a = (n1/2)*(n1/2)*2;

lli b=n1/2*(n1+1);

if (n % 2) a+=n;

cout<<b-a;

return 0;

}

Cách 2 Dùng phương pháp lặp (Không thực hiện được với dữ liệu lớn, chỉ ăn

được 50% số test)

2.2.2 Giải pháp 2: Sử dụng hai đẳng thức bằng nhau

Bài toán : Xếp đẳng thức bằng que diêm

Giả sử ta muốn xếp đẳng thức đúng bằng cách xếp que diêm a+b=c với a,

b, c là nguyên dương và đại diện cho số lượng que diêm

Ví dụ đẳng thức 2+2=4 (││+││=││││), 1+2=3 (│+││=│││) là các đẳng thức đúng, còn 1+2=4 (│+││=││││) và 2+2=3 (││+││=│││) và 0+1=1 (+│=│) là đẳng thức sai

Hãy tìm cách sử dụng n que diêm để xếp thành một đẳng thức đúng, nếu thiếu thì bạn cần mua thêm Hỏi bạn cần mua thêm ít nhất bao nhiêu que diêm? (với 2≤n≤109)

Dữ liệu vào gồm một dòng chứa số n là số lượng que diêm đã có, dữ liệu

ra là số lượng que diêm cần mua thêm

Trang 8

Ý tưởng cho bài toán này là:

Vì a, b, c nguyên dương và a + b = c nên a + b + c = 2c là một số nguyên chẵn Như vậy, nếu n là số nguyên chẵn thì bạn không cần mua thêm que diêm, còn nếu n là số nguyên lẻ thì bạn cần mua thêm 1 que để có số que chẵn

Trường hợp đặc biệt, nếu n =2 chẵn nhưng không thể phân tích thành tổng của 3 số nguyên dương nên khi đó bạn cần mua thêm 2 que diêm

Dưới đây là code tham khảo của bài toán

#include <bits/stdc++.h>

using namespace std;

int main()

{

ifstream cin("input.txt");

ofstream cout ("output.txt");

int n;

cin >> n;

if (n==2) cout << "2\n";

else if (n%2 == 0) cout << "0\n" ;

else cout << "1\n" ;

return 0;

}

2.2.3 Giải pháp 3: Sử dụng cách tìm chu vi nhỏ nhất của hình chữ nhật có diện tích cho trước

Bài toán Những viên đá cuội (Nguồn: Đề bài thi HSG cấp Tỉnh Hải Dương

- năm học 2012-2013).

Trong dịp nghỉ hè, bé Mai được bố mẹ cho đi tắm biển Trên bờ biển bé nhặt được N viên đá cuội rất đẹp mắt Mai quyết định vẽ trên cát một lưới hình chữ nhật kích thước a x b (a, b nguyên dương) được chia thành a x b ô vuông bằng các đường ngang dọc sao cho có thể rải N hòn sỏi này vào các ô vuông sao cho mỗi ô vuông có nhiều nhất một viên sỏi

Hãy giúp bé Mai chọn kích thước của hình chữ nhật sao cho chu vi của nó

là nhỏ nhất In ra màn hình giá trị chu vi này (với N ≤ 109)

Ví dụ:

Dữ liệu nhập vào: 15 Kết quả in ra: 16 Giải thích: Hình chữ nhật tìm được có kích thước 4 x 4

Nhận xét:

Thật ra bài toán này có thể phát biểu lại là tìm chu vi nhỏ nhất của hình chữ nhật có diện tích n cho trước Ta có thể giải bài toán này bằng cách duyệt

Trang 9

toàn bộ các khả năng có thể của chiều rộng a (a là ước của n và a ≤ sqrt(n)), với mỗi a tìm được ta đi tính b = n/a Kết quả cần tìm là giá trị min((a+b)*2)

Dưới đây là code tham khảo của bài toán theo cách này

#include <bits/stdc++.h>

#define lli long long

using namespace std;

int main()

{

ifstream cin("input.txt");

ofstream cout ("output.txt");

int n;

cin>>n;

int nmin=1e9;

for ( int a=1; a*a<=n; a++)

if (n % a ==0) {

int b=n/a;

nmin = min( nmin,2*(a+b));

}

cout<<nmin;

return 0;

}

2.2.4 Giải pháp 4: Sử dụng tổ hợp, nhóm các phần tử cùng thỏa mãn điều kiện

Bài toán Taxi (Nguồn: Đề bài thi HSG cấp Tỉnh Thanh Hóa- năm học 2017-2018).

Trong dịp nghỉ hè các bạn học sinh lớp 12 dự định tổ chức dã ngoại đến biển Sầm Sơn và sẽ đi bằng taxi Các bạn được chia thành n nhóm, nhóm thứ i gồm Si bạn (1 ≤ Si ≤ 4) và mỗi chiếc taxi chở tối đa 4 hành khách Vậy lớp 12 cần thuê ít nhất bao nhiêu chiếc taxi để chở các nhóm đi, với điều kiện là các bạn trong nhóm phải ngồi chung taxi (một taxi có thể chở một nhóm trở lên)

Dữ liệu vào: Từ tệp văn bản “input.txt” gồm:

- Dòng đầu chứa số nguyên n (1 ≤ n ≤ 105) (số lượng các nhóm học sinh)

- Dòng số 2 chứa dãy số nguyên S1, S2, , Sn (1 ≤ Si ≤ 4) Các số nguyên cách nhau bởi dấu cách với Si là số học sinh trong nhóm thứ i

Dữ liệu ra: 1 số nguyên duy nhất là số lượng tối thiểu xe taxi cần thiết để chở

tất cả học sinh đến nơi

Ví dụ:

Trang 10

Input.txt Output.txt

5

1 2 4 3 3

4

Bài này có thể giải theo những cách sau:

Cách 1: Tư duy theo kiến thức toán học Ta có các nhận xét như sau:

- Nhóm 4 người không đi chung với nhóm nào  số lượng nhóm 4 người = số lượng xe taxi cần gọi

- Nhóm 3 người chỉ có thể đi chung với nhóm 1 người  số lượng nhóm 3 người = số lượng xe taxi cần gọi

- Nhóm 2 người có thể ghép với nhau  số lượng xe taxi cần gọi = số lượng nhóm 2 người chia lấy phần nguyên cho 2

- Nhóm 1 người ghép với nhóm 3 người, số còn lại ghép cứ 4 nhóm với nhau, nếu số dư là 3 thì đi chung 1 xe, dư 2 hoặc 1 thì ghép với nhóm 2 người thừa ở trên

Kết quả của bài toán là tổng của tất cả các phân tích ở trên

Độ phức tạp của thuật toán theo cách này là O(n)

Dưới đây là code tham khảo của bài toán

#include <bits/stdc++.h>

using namespace std;

int main()

{

ifstream cin("input.txt");

ofstream cout ("output.txt");

int cnt[5] = {0}, A[100005] ;

int N, kq;

cin>>N;

for(int i=1; i<=N;i++ ){

cin>>A[i];

cnt[A[i]]+=1;

}

kq=cnt[4]+cnt[3]+cnt[2]/2;

if (cnt[1]>=cnt[3]) cnt[1]-=cnt[3]; else cnt[1]=0;

cnt[2]= cnt[2]%2;

kq+=(cnt[2]*2+cnt[1])/4;

if (cnt[2]*2+cnt[1]%4 > 0) kq += 1;

cout << kq;

return 0;

Trang 11

Cách 2 Tìm kiếm nhị phân:

Bài này cần tìm kiếm nhị phân trên dãy dữ liệu của đề bài, nhưng trước khi tìm kiếm nhị phân, cần sắp xếp lại dữ liệu của đề bài thành dãy không giảm

Độ phức tạp của thuật toán theo cách này là O(nlogn) (Cách làm này đã được thực hiện ở đề tài trước).

2.2.5 Giải pháp 5: Sử dụng công thức truy hồi, đệ quy

Bài toán Lucky number

Chí Phèo thời IT rất yêu thích các số Lucky Số Lucky là số mà chỉ chứa các chữ số Lucky (có hai chữ số Lucky là 4 và 7) trong biểu diễn thập phân Các

số Lucky sắp xếp tăng dần tạo thành dãy số Lucky Một số số hạng đầu tiên của dãy số Lucky là: 4,7,44,47,74,77,… Biết Chí có niềm yêu thích như vậy, Thị Nở liền đố Chí tìm số Lucky thứ K trong dãy Bài toán thực sự hóc búa với Chí, bạn hãy giúp anh Chí câu hỏi này nhé! Biết rằng:

Dữ liệu vào: Tệp văn bản gồm số n (n109) duy nhất

Dữ liệu ra: Tệp văn bản chứa số Lucky tìm được

Ví dụ:

Input.txt Output.txt

Bài này có thể giải theo những cách như sau:

Cách 1 Tư duy theo kiểu Toán học.

Nhận xét:

- Hai phần tử đầu tiên là A[1]=4, A[2]=7

- Các phần tử ở vị trí lẻ đều có kết thúc là 4, ngược lại thì kết thúc là 7 Nếu bỏ chữ số cuối đi thì phần số còn lại của phần tử sẽ là một số ở vị trí trước đó trong dãy Cụ thể: Nếu cho biết vị trí của số đó là N thì :

+ Nếu N lẻ thì chữ số cuối là 4 và phần còn lại của phần tử này chính là phần tử A[N/2]

+ Nếu N chẵn thì chữ số cuối là 7 và phần còn lại của phần tử này chính là phần

tử A[N/2-1]

Từ các nhận xét trên ta có công thức đệ quy:

- Nếu N lẻ: A[N] = A[N/2]*10+4

- Ngược lại: A[N] = A[N/2-1]*10+7

Ngày đăng: 20/05/2021, 21:09

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