1. Trang chủ
  2. » Công Nghệ Thông Tin

CHUYÊN đề 2 một số THUẬT TOÁN cơ bản PYTHON THCS

21 203 7

Đ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 884,97 KB

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

Nội dung

TÀI LIỆU BỒI DƯỠNG HỌC SINH GIỎI TIN HỌC BẬC THCS CHUYÊN ĐỀ 2 MỘT SỐ THUẬT TOÁN CƠ BẢN Tác giả NGƯT Nguyễn Tấn Phong Đơn vị Trường THCS Đồng Nai, huyện Cát Tiên, tỉnh Lâm Đồng PHẦN I CÁC DẠNG TOÁN, THUẬT TOÁN CỦA ĐỀ THI HSG TIN THCS 1 Định hướng đề thi Thuật toán đa dạng, phù hợp với nhiều mức độ năng lực học sinh, bám sát theo xu hướng ra đề chung của các huyện và tình hình học sinh Mỗi bài toán luôn có nhiều phương án giải khác nhau, độ phức tạp và tối ưu thuật toán khác nhau Đề gồm 3 hoặc 4 b.

Trang 1

CHUYÊN ĐỀ 2:

MỘT SỐ THUẬT TOÁN CƠ BẢN

Tác giả: NGƯT Nguyễn Tấn Phong Đơn vị: Trường THCS Đồng Nai, huyện Cát Tiên, tỉnh Lâm Đồng

PHẦN I CÁC DẠNG TOÁN, THUẬT TOÁN CỦA ĐỀ THI HSG TIN THCS

1 Định hướng đề thi

- Thuật toán đa dạng, phù hợp với nhiều mức độ năng lực học sinh, bám sát theo

xu hướng ra đề chung của các huyện và tình hình học sinh Mỗi bài toán luôn có nhiều

phương án giải khác nhau, độ phức tạp và tối ưu thuật toán khác nhau

- Đề gồm 3 hoặc 4 bài, có thể chia đều điểm/bài theo thang 20 điểm

2 Các dạng toán thường gặp

2.1 Dạng 1: Dạng toán số học, xử lý phạm vi dữ liệu số

Các bài toán số học cơ bản với số nguyên (hai hoặc ba số) như tìm UCLN, BCNN của số nguyên, số nguyên tố, tính tổng quy luật, tổng liên tiếp, … Dùng hàm số học cơ bản //,%, abs(), sqrt(), … như tách số, xác định tính chẵn lẻ, …

Các bài toán số học đơn giản trên dãy số mà phần tử của dãy mô tả được bằng

phương pháp liệt kê hoặc chỉ ra tính chất đặc trưng và có giới hạn số phần tử, như liệt

kê số phần tử dãy số, tìm phần tử thứ i dãy số, tổng phần tử dãy số (VD: dãy số nguyên

tố, dãy số fibonacci, dãy lucas, dãy số tiến, …)

2.2 Dạng 2: Các bài toán mảng một chiều và xâu ký tự

Sử dụng các thuật toán cơ bản mảng một chiều, string như sắp xếp, tìm kiếm phần

tử thỏa tính chất, thêm bớt, …; chuỗi đối xứng, loại bỏ ký tự trùng nhau, chuyển đổi chuỗi thành số, …

Các thuật toán về dãy số đơn điệu mà phần tử của dãy không mô tả được bằng

phương pháp liệt kê hoặc chỉ ra tính chất đặc trưng như phần tử tăng liên tiếp, giảm

liên tiếp, dãy con thỏa tính chất, dãy con bị chặn, …

2.3 Dạng 3: Các bài toán mảng hai chiều, gắn liền thực tiễn

Sử dụng các thuật toán cơ bản trên mảng hai chiều (ma trận số) như sắp xếp, tìm kiếm, … theo hàng, theo cột, theo đường chéo

Bài toán với thuật toán có độ phức tạp cao, có thể giải bằng nhiều thuật toán Đề bài là những bài toán mang tính thực tế có liên hệ với cuộc sống (định hướng hướng phát triển năng lực học sinh, theo hướng tích hợp), sử dụng thuật toán nâng cao để phân hóa

và xét chọn giải cho học sinh

3 Biểu điểm và định hướng chấm

- Chấm tự động bằng phần mềm Themis và chấm code để phân hóa

- Dịch thành công chương trình và đọc được dữ liệu từ file lên biến nhớ 1đ/1bài

(chấm tự động và chấm code)

- Mỗi bài chấm từ 4 -> 5test (gồm 2 test dữ liệu nhỏ, 2 test dữ liệu lớn, 1 test biên hoặc cực biên), mỗi test 1 điểm (chấm tự động)

- Giới hạn thời gian tối đa 5s

- Xét giải ưu tiên điểm trước, sau đó đến thuật toán

Trang 2

PHẦN II CÁC DẠNG TOÁN, THUẬT TOÁN CƠ BẢN

I. Quy ước lại khái niệm thuật giải và thuật toán

Thuật giải: Là tập hợp các bước tuần tự để giải hoàn chỉnh một bài toán, một số

bước trong thuật giải có thể thay đổi vị trí mà không ảnh hưởng đến kết quả

Thuật toán: Là tập hợp các bước tuần tự gồm phép toán và câu lệnh để giải bài

toán, các bước và phép toán trong thuật toán không thể thay đổi được

Ví dụ 1:

Ví dụ 2: Viết chương trình tìm số lớn nhất (max) trong hai số

Thứ tự các bước phải làm là:

II Xây dựng hàm để giải các bài toán thực tế

Đặt vấn đề: Hàm trong giải toán tin học rất quan trọng, nó có tính then chốt để có

thể giải hoàn chỉnh một bài toán Tất cả các ngôn ngữ lập trình đều có phần định nghĩa hàm (function/define)

Thông thường hàm có hai kiểu trả về giá trị là trả về giá trị là số hoặc trả về giá trị logic dạng True/False Nếu cần tính toán kết quả nào đó thì xây dựng hàm trả về giá trị số, nếu để kiểm tra tính chất thì trả về giá trị logic True/False

Đối với python, hàm có thể trả về cùng lúc nhiều giá trị hoặc một dữ liệu có cấu trúc như chuỗi hay danh sách,

return sum ( map ( int , str ( )))

Ví dụ 2: Viết hàm kiểm tra tổng các chữ số của một số nguyên dương n là số chẵn

hay lẻ -> kiểu tra về là logic True/False

Trang 3

def kttongcs( ):

stam = 0

for i in str ( ): stam = stam + int ( )

if stam % == 0 return True else: return False

Ví dụ 3: Viết hàm kiểm tra số nguyên tố n -> kiểu tra về là logic True/False

def ktnt( ):

if n < : return False for i in range ( , // 2 1 ):

if n % == 0 return False return True

- List Comprehensions là một danh sách cần tạo mới, ta gọi là newlist

- <action> là một hành động/thao tác cần thực hiện với phần tử newlist

- <item> đối tượng (ảo) chỉ có tác động trong cú pháp newlist

- <iterrator> là đối tượng tuần tự/có thể lặp được, gồm: str, list, tuple, range, list comprehension

- <some condition> biểu thức điều kiện

Trang 4

nhưng nó không được gán cho một danh sách cụ thể nào hết Muốn truy xuất hãy dùng một biến để lưu lại

Ví dụ 3: Tìm số nguyên tố trong dãy A

Ví dụ 4: Loại bỏ các chữ giống nhau trong 1 chuỗi hay các số giống nhau trong

mảng 1 chiều (tỉa chuỗi, mảng)

#tỉa chuỗi/tỉa mảng bằng List Comprehension

Cho dãy gồm N phần tử là số nguyên dương A1, A2, , An; (0<N<=103;

0<Ai<=106) Viết chương trình tìm những số tự mãn trong dãy số đã cho?

Dữ liệu vào từ file: SOTUMAN.INP

- Dòng đầu tiên chứa số nguyên dương N

- Dòng thứ hai chứa N số nguyên dương, các số cách nhau một khoảng trắng

Kết quả ra file: SOTUMAN.OUT

- Dòng đầu tiên ghi các số tự mãn tìm được theo thứ tự tăng dần, các số cách nhau một khoảng trắng

Trang 5

Tạo một <iterrator> mới có số phần tử từ index start đến index end -1

bước nhảy bỏ qua phần tử step

- <iterrator> là đối tượng tuần tự/có thể lặp được, gồm: str, list, tuple, range, list comprehension

- index start: chỉ số đầu, không có mặc định là 0

- index end: chỉ số cuối, không có mặc định là chiều dài của <iterrator> + 1

- step: bước nhảy, khoảng cách bỏ qua chỉ số, mặc định là 1

Trang 6

mảng c ở đây là mảng 2 chiều và gọi là bảng các phương án khả thi

Ví dụ 3: Tìm tất cả các đoạn con dương có số phần tử lớn nhất

if lenmax<len(A[i:j]): lenmax = len(A[i:j])

#xuất các phương án thỏa điều kiện từ bảng phương án khả thi

for i in c:

if len(i)==lenmax: print(i)

Ví dụ 4: Xuất chỉ số bắt đầu và số phần tử của của dãy con dương dài nhất

for i in c:

if len(i)==lenmax:

print(A.index(i[0]),' ',len(i))

#index là một hàm tìm kiếm chỉ số trên <iterrator>

Trang 7

I DẠNG 1 - CÁC BÀI TOÁN SỐ HỌC CƠ BẢN

Bài 1 Tính tổng liên tiếp

Viết chương trình tính tổng các số nguyên dương liên tiếp không quá N (n <106)

Dữ liệu vào từ file: BAI1.INP

- Dòng đầu tiên ghi số nguyên dương N (n < 106)

Kết quả ra file: BAI1.OUT

- Dòng đầu tiên ghi tổng các số nguyên tính được

#Ghi vào file OUT

with open('bai1.out','w')as fo:

print(tong,file=fo)

☼Tìm hiểu thêm:

*/ Sự khác biệt giữa mở file bằng hàm open và bằng câu lệnh with

Chúng ta đều có thể sử dụng hàm open lẫn câu lệnh with để mở file trong python

Việc lựa chọn phương pháp nào thì tuỳ theo sở thích của mỗi lập trình viên, tuy nhiên thì hai phương pháp này cũng có điểm khác biệt, đó chính là trong cách đóng lại file sau khi

Trang 8

mở Với file được mở bằng hàm open, chúng ta phải đóng lại file đó sau khi đã mở và thao tác xong với file Tuy nhiên thì đối với file được mở bằng câu lệnh with, chúng ta không cần phải đóng lại file sau khi mở, vì câu lệnh with vốn tự động đóng lại file cho chúng ta rồi

*/ Ghi dữ liệu vào file bằng phương thức <biến file>.write()

Tại dòng 10 ta có thể thay câu lệnh print(tong,file=fo)bằng lệnh

fo.write(str(tong))

print(giá trị cần ghi, file=<biến file>) là một hàm; điểm khác là khi ghi dữ liệu bằng phương thức write() thì giá trị đó phải được chuyển thành dạng chuỗi bằng hàm str()

*/ Thuật toán tính tổng như trên có tên gọi là cộng dồn giá trị Khi tính tổng cần

thiết phải có một biến để lưu giữ kết quả tính sau mỗi lần lặp, biến đó phải được khởi tạo bằng 0 trước khi tham gia vào vòng lặp cộng dồn

tong = 0

for i in range(n+1):

tong = tong + i Nếu không có câu lệnh tong = 0 kết quả vẫn đúng, không sai nhưng có thể sai

ở những trường hợp bài toán khác

#ghi file OUT

with open('bai1a.out','w') as fo:

print(round(tong,3),file=fo)

Bài 1b: Viết chương trình tính tổng 𝑺 = 𝟏 + 𝟏

Bài 2 Tính tổng thỏa điều kiện chia hết

Viết chương trình tính tổng các số nguyên dương chẵn liên tiếp không quá N (n <

106)

Trang 9

Dữ liệu vào từ file: BAI2.INP

- Dòng đầu tiên ghi số nguyên dương N (n < 106)

Kết quả ra file: BAI2.OUT

- Dòng đầu tiên ghi tổng các số nguyên tính được

#Ghi vào file OUT

with open('bai2.out','w')as fo:

print(tong,file=fo)

Bài 3 Tính tổng thỏa nhiều điều kiện chia hết

Viết chương trình tính tổng các số nguyên dương không quá N (n < 106)

Dữ liệu vào từ file: BAI3.INP

- Dòng đầu tiên ghi số nguyên dương N (n < 106)

Kết quả ra file: BAI3.OUT

- Dòng đầu tiên ghi tổng các số chia hết cho 3 và chia hết cho 7

- Dòng thứ hai ghi tổng các số vừa chia hết cho 4 và không chia hết cho 5

- Dòng thứ ba ghi tổng các số chia hết cho 13 hoặc chia hết cho 15

⸙Thuật toán:

Ứng dụng tính chất chia hết bằng phép toán % kết hợp với hàm or, and

ↈCode tham khảo:

Trang 10

#Ghi vào file OUT

with open('bai3.out','w')as fo:

print(tong1,tong2,tong3,sep='\n',file=fo)

print(tong1,file=fo)

print(tong2,file=fo)

print(tong3,file=fo)

☼Tìm hiểu thêm:

- Câu lệnh: print(tong1,tong2,tong3,sep='\n',file=fo)

Tương ứng với 3 câu lệnh:

print(tong1,file=fo)

print(tong2,file=fo)

print(tong3,file=fo)

- Trong hàm print() có hai chỉ thị thường dùng để ghi dữ liệu là vào file là:

sep='kí tự' -> giữa các giá trị cần ghi là 'kí tự'

end='kí tự' -> kết thúc lệnh cần ghi là 'kí tự'

với '\n' là xuống dòng

Bài 4 Ứng dụng tính chất chia hết để tìm ước của một số dương

Viết chương trình tìm các ước của số nguyên dương N (n < 106)

Dữ liệu vào từ file: BAI4.INP

- Dòng đầu tiên ghi số nguyên dương N (n < 106)

Kết quả ra file: BAI4.OUT

- Dòng đầu tiên ghi các ước của số nguyên N, mỗi số cách nhau một khoảng trắng

- Dòng thứ hai, ghi tổng các ước của N (kể cả N)

- Dòng thứ ba, nếu N là số hoàn hảo thì ghi CO, ngược lại ghi KHONG

Ví dụ:

BAI4.INP BAI4.OUT

10 1 2 5 10

18 KHONG

Trang 11

- Ước của một số dương N, là các số i <=N mà N%i== 0

- Cho a và b là hai số đếm được, nếu a chia hết cho b thì b được gọi là ước số của

a Chẳng hạn số 12 có các ước số là 1, 2, 3, 4, 6 và 12 Trong các ước của a thì loại trừ a

là ước số lớn nhất của a, ta gọi các ước số khác nhỏ hơn là ước số thực sự của a

- Nếu tổng các ước số thực sự của a cũng bằng a thì ta gọi a là số hoàn hảo Chẳng hạn số 6 có các ước số thực sự là 1, 2 và 3 Ta có: 1 + 2 + 3 = 6 thì 6 là số hoàn hảo Một thí dụ khác về số hoàn hảo là số 28 Số này có các ước số thực sự là 1, 2, 4, 7,

#ghi file OUT

with open('bai4.out','w') as fo:

if tongts==n:print('CO',file=fo)

else:print('KHONG',file=fo)

ↈCode tham khảo (tối ưu dòng lệnh):

#Thuật toán và Ghi vào file OUT

with open('bai4.out','w')as fo:

tonguoc=0

for i in range(1,n+1):

if n%i==0:

print(i,end=' ',file=fo)

tonguoc = tonguoc+i #tính tổng các ước print(file=fo) # để xuống dòng

print(tonguoc,file=fo)

Trang 12

13

14

if tonguoc == 2*n: print('CO',file=fo)

else: print('KHONG',file=fo)

☼Tìm hiểu thêm: - Cách viết thuật toán và ghi file OUT như trên gọi là cách ghi file trực

tiếp ngay trong thuật toán

Bài 5: Vận dụng tính chia hết để tìm ước chung của hai hay nhiều số

Viết chương trình tìm các ước chung của ba số nguyên dương a,b,c (a,b,c < 106)

Dữ liệu vào từ file: BAI5.INP

- Dòng đầu tiên ghi ba số nguyên dương a, b và c cách nhau một khoảng trắng

Kết quả ra file: BAI5.OUT

- Dòng đầu tiên ghi các ước chung của ba số, các số cách nhau một khoảng trắng

- Ước chung của hai số a, b là số k nếu (a%k==0) and (b%k ==0)

- Số 1 là ước chung của tất cả các số

- Thuật toán tìm ước chung của 3 số a, b, c:

+ Duyệt từ k chạy từ 1 đến a, nếu (a%k == 0) and (b%k == 0) and (c%k == 0) thì

k là ước chung của a, b, c Tương tự cách tìm cho nhiều số

Cài đặt code theo thuật toán trên:

for k in range(1,a+1):

if (a%k==0)and(b%k==0)and(c%k==0):print(k)

*Vấn đề tối ưu:

- Thuật toán trên là không tối ưu nhưng chắc chắn luôn đúng

- Để tối ưu ta tìm min(a,b,c), rồi duyệt k chạy từ 1 đến min(a,b,c)

for i in range(1,min(a,b,c)+1):

if (a%k==0)and(b%k==0)and(c%k==0):print(i)

ↈCode tham khảo:

with open('bai5.inp') as fi:

a,b,c = map(int,fi.readline().split())

#Thuật toán và Ghi vào file OUT

with open('bai5.out','w')as fo:

for k in range(1,min(a,b,c)+1):

if( % ==0 and( % ==0 and( % ==0):print( ,end=' ',file=fo)

☼Tìm hiểu thêm: - Trong python có sẵn hàm min(), max() của hai hay nhiều số

Bài 6: Vận dụng tính chia hết để tìm UCLN và BCNN của 2 hay nhiều số

Viết chương trình tìm các UCLN và BCNN của ba số nguyên dương a,b,c

(a,b,c<106)

Dữ liệu vào từ file: BAI6.INP

- Dòng đầu tiên ghi ba số nguyên dương a, b và c cách nhau một khoảng trắng

Kết quả ra file: BAI6.OUT

Trang 13

- Dòng đầu tiên ghi UCLN của ba số

- Dòng thứ hai ghi BCNN của ba số

- Dòng thứ ba ghi lần lượt các BC không quá 102

a,b,c=map(int,fi.readline().split())

import math

ucln=math.gcd(a,b,c)

bcnn1=a*b//math.gcd(a,b)

bcnn2=c*bcnn1//math.gcd(bcnn1,c)

#ghi file OUT

with open('bai6.out','w') as fo:

print(ucln,file=fo)

math.gcd(a,b) Ước chung lớn nhất của a và b math.sin(x)

math.cos(x) math.tan(x) math.asin(x) math.acos(x)

Các hàm lượng giác

Trang 14

math.atan(x)

Bài 7: Xác định tính nguyên tố của một số bằng phướng pháp tìm ước

Viết chương trình tìm các ước của số nguyên dương N (n < 106)

Dữ liệu vào từ file: BAI7.INP

- Dòng đầu tiên ghi số nguyên dương N (n < 106)

Kết quả ra file: BAI7.OUT

- Nếu số N là nguyên tố thì ghi CO, ngược lại ghi KHONG

- Số nguyên tố là số chỉ có hai ước là 1 và chính nó

- Thuật toán: Nếu tồn tại một số 1<i<N mà N%i== 0 thì N là hợp số, ngược lại N

là số nguyên tố

- Thuật toán dựa trên kĩ thuật “Đặt cờ hiệu”:

Bước 1: Giả sử số N là số nguyên tố

Bước 2: Tìm kiếm từ 2 đến (N//2+1) để phủ nhận bước 1

Bước 3: Trả lời kết luận

ↈCode tham khảo:

#Ghi vào file OUT

with open('bai7.out','w')as fo:

print(ktnt,file=fo)

☼Tìm hiểu thêm:

Bài 8: Tách các chữ số của một số nguyên

Viết chương trình tính tổng các chữ số của một số nguyên dương N (n < 106)

Dữ liệu vào từ file: BAI8.INP

- Dòng đầu tiên ghi số nguyên dương N (n < 106)

Kết quả ra file: BAI8.OUT

- Dòng đầu tiên ghi tổng tìm được

Ví dụ:

BAI8.INP BAI8.OUT

⸙Thuật toán:

Trang 15

Lý thuyết số: Nếu số nguyên N có a chữ số, thì ta thực hiện liên tiếp (a-1) lần phép tính

(n=n//10) và từng chữ số từ phải qua trái sẽ là phép (n%10) thì sẽ tách được hết các chữ

#Ghi vào file OUT

with open('bai8.out','w')as fo:

print(tongcs,file=fo)

☼Tìm hiểu thêm: - Trên đây là thuật toán thường gặp Ngoài ra, trong python có một số

cách khác tính tổng các chữ số của một số nguyên vô cùng đơn giản như sau:

tongcs =sum(map(int,str(n))) Tính tổng các chữ số của N

list(str(n)) Liệt kê các chữ số của N

⸎Luyện tập thêm: Một số ứng dụng kĩ thuật tách chữ số

Đôi khi trong thực tế cuộc sống, con người thường tự quy ước một số tính chất nào

đó của một số số học Chẳng hạn: số điện thoại cầu tài, số tứ quý, số ngũ linh, số thần tài,

số tiến, nút của một số, số đẹp, … Những quy ước này mang tính tự phát không hẳn là tính chất số học theo lý thuyết số Các ví dụ dưới đây là một cách quy ước như vậy:

Bài 9a: Kiểm tra số đẹp

Quy ước:

- Số đẹp là số mà có tổng các chữ số chia cho 10 có số dư là 9 (nút)

- Số tiến là số có hai chữ số trở lên và các chữ số theo thứ tự từ trái qua phải là tăng

dần

Viết chương trình kiểm tra một số nguyên dương N có là số theo quy ước như trên không?

Dữ liệu vào từ file: SODEP.INP

- Dòng đầu tiên ghi số nguyên dương N (n < 106)

Kết quả ra file: SODEP.OUT

- Dòng đầu tiên, nếu số N là số số đẹp thì ghi CO, ngược lại ghi KHONG

- Dòng thứ hai, nếu N là số tiến thì ghi số -1, ngược lại thì ghi số 0

Ngày đăng: 30/04/2022, 07:12

HÌNH ẢNH LIÊN QUAN

mảng cở đây là mản g2 chiều và gọi là bảng các phương án khả thi. - CHUYÊN đề 2 một số THUẬT TOÁN cơ bản PYTHON THCS
m ảng cở đây là mản g2 chiều và gọi là bảng các phương án khả thi (Trang 6)

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