Một số thuật toán đặc trưng về số học trong ôn thi học sinh giỏi bằng ngôn ngữ lập trình c++

22 10 0
Một số thuật toán đặc trưng về số học trong ôn thi học sinh giỏi bằng ngôn ngữ lập trình c++

Đ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

1 MỞ ĐẦU 1.1 Lí chọn đề tài Người xưa nói “Hiền tài ngun khí quốc gia” bồi dưỡng học sinh giỏi bước để đào tạo nhân tài cho đất nước, cho địa phương nhiệm vụ trọng tâm toàn nghành giáo dục nước ta Điều khẳng định tầm quan trọng nghiệp giáo dục đào tạo, Nghị Trung ương “Cùng với khoa học công nghệ, giáo dục – đào tạo quốc sách hàng đầu nhằm nâng cao dân trí, đào tạo nhân lực, bồi dưỡng nhân tài” Công tác bồi dưỡng học sinh giỏi nhiệm vụ quan trọng việc nâng cao chất lượng giáo dục, bồi dưỡng nhân tài cho quê hương, đất nước Nhận thức nhiệm vụ quan trọng nhà trường xây dựng kế hoạch từ đầu năm học Bồi dưỡng học sinh giỏi cơng việc khó khăn lâu dài, địi hỏi nhiều cơng sức thầy trò Trong năm gần đây, qua kỳ thi học sinh giỏi cấp tỉnh trường THPT Hà Trung đạt thành cơng định góp phần vào kết thi học sinh giỏi, thành tích chung tồn trường Với vai trị người thầy dẫn dắt đội tuyển học sinh giỏi cần giúp học sinh định hướng theo logic hệ thống kiến thức cụ thể sau: Sau tập nâng cao giáo viên cần đưa phương pháp giải lưu ý nhằm học sinh tự khắc sâu kiến thức để cách trình bày lập luận lơgic Sau chun đề cần có kiểm tra đánh giá theo mức độ để nắm tình hình học sinh bị hổng phần nào, chưa tốt giáo viên sửa khắc sâu Ngoài giáo viên sưu tầm ngân hàng đề thi cấp trường, cấp tỉnh tỉnh khác nhằm giúp em tiếp xúc làm quen với dạng đề có nhiều điểm mới, hay hữu ích Để có đội tuyển học sinh giỏi lâu dài phải có lộ trình bồi dưỡng biết thừa kế qua năm học trước người thầy phải ln ln có ý thức tự rèn luyện, tích lũy tri thức kinh nghiệm, trau dồi chuyên môn, xứng đáng “người dẫn đường tin cậy” cho học sinh noi theo Phải thường xun tìm tịi tư liệu, có kiến thức nâng cao phương tiện, đặc biệt mạng internet Lựa chọn trang Web hữu ích nhất, tiện dụng nhất, tác giả hay có chuyên đề hay, khả quan để sưu tầm tài liệu… Thực phương châm: dạy dạy nâng cao, thông qua luyện cụ thể để dạy phương pháp tư dạy kiểu dạng có quy luật, loại có tính đơn lẻ luyện dạng tổng quát Trong tập cần đưa nhiều câu với mức độ từ dễ đến khó câu nhỏ cuối ta nên vận dụng vào thực tế để em hiểu rõ câu vận dụng tích hợp Chính xin đề xuất chuyên đề nhỏ công tác ôn thi học sinh giỏi cấp Tỉnh “ Một số thuật tốn đặc trưng số học ơn thi học sinh giỏi ngơn ngữ lập trình C++” 1.2 Mục đích nghiên cứu Khi tiến hành nghiên cứu đề tài: “ Một số thuật toán đặc trưng số học ôn thi học sinh giỏi ngơn ngữ lập trình C++” tơi đặt mục đích sau: + Giúp học sinh áp dụng tốt “ Một số thuật toán đặc trưng số học ôn thi học sinh giỏi ngôn ngữ lập trình C ” để giải nhanh hiệu mảng toán số học loại + Phát triển tối đa lực tư duy, lực phát vấn đề, kĩ lập trình số nguyên tố, số fibonaci, ước chung lớn nhất, bội chung nhỏ nhất, số lớn cho học sinh + Góp phần nâng cao hứng thú, say mê, tích cực, chủ động tự học học sinh q trình lập trìnhkhi học mơn Tin Học + Tư áp dụng “thuật toán đặc trưng ngôn ngữ C++” nhằm giúp học sinh nhận diện áp dụng nhanh gặp toán số học lập trình Các tốn lớn quy toán nhỏ quen thuộc 1.3 Đối tượng nghiên cứu Trong nhiều toán Tin học, việc vận dụng kiến thức số học giúp đưa thuật toán tối ưu Mặt khác, tốn Tin học có vận dụng kiến thức số học bản, địi hỏi cài đặt khơng q phức tạp em có tảng Tốn học tốt dễ dàng suy luận Từ kích thích niềm yêu thích em việc lập trình Các thuật tốn số học tin học nội dung kiến thức quan trọng sử dụng nhiều thiết kế thuật toán Tuy nhiên, q trình giảng dạy tơi thấy học sinh cịn khó khăn việc phân tích tốn để áp dụng thuật tốn cài đặt giải tốn Vì tơi chọn chun đề để giúp học sinh có hệ thống kiến thức toán học để giúp em dễ dàng giải toán cụ thể đối tốn số học Tơi đề cập tới vấn đề chính: Số nguyên tố, Ước số, Bội số, Số Fibonacci, Xử lí số nguyên lớn, Do chuyên đề toán số học nên kiến thức sở ứng dụng tập cụ thể 1.4 Phương pháp nghiên cứu -Phương điều tra khảo sát thực tế: Từ thực tế trường THPT Hà Trung số trường bạn Tỉnh - Phương pháp thu thập thông tin: Thơng qua mạng Internet cơng cụ tìm kiếm Kết hợp đề trường THPT khác tỉnh tỉnh - Phương pháp thống kê, xử lí số liệu: Đối chiếu kết thi học sinh giỏi năm gần - Phương pháp thực nghiệm: Dựa kế hoạch môn học, kế hoạch dạy bồi dưỡng, soạn giáo án tiết dạy có áp dụng sáng kiến kinh nghiệm, thực tiết dạy nhà trường nhằm kiểm chứng kết nghiên cứu đề tài đưa đề xuất cần thiết 1.5 Những điểm sáng kiến kinh nghiệm Năm học 2015-2016 viết sáng kiến kinh nghiệm “Thuật tốn tối ưu tìm ước chung lớn nhất” đạt giải C cấp Tỉnh Sở Giáo Dục Đào tạo cấp Khi thuật tốn áp dụng viết ngơn ngữ lập trình Pascal Năm học 2020-2021 viết sáng kiến kinh nghiệm “ Một số thuật toán đặc trưng số học ôn thi học sinh giỏi ngôn ngữ lập trình C++” đọan lệnh xử lí thay ngơn ngữ lập trình C++ tối ưu ngơn ngữ lập trình Pascal thể phần ước số, bội số NỘI DUNG SÁNG KIẾN KINH NGHIỆM 2.1 Cơ sở lí luận sáng kiến kinh nghiệm Về mặt lí thuyết số học có nhiều tài liệu trình bày, tài liệu giáo khoa chuyên Tin hệ thống cụ thể Chuyên đề sưu tầm, chọn lọc, xếp hệ thống vấn đề toán số học theo mạch kiến thức định dựa số nguồn tài liệu có Cùng với đó, chúng tơi có đưa phân tích, đánh giá để làm sáng tỏ cho vấn đề đề cập tới Với cách tiếp cận mở vậy, hy vọng chuyên đề giúp em học sinh có hệ thống kiến thức cần thiết, thầy giáo có chun đề chun mơn bổ ích thiết thực Giáo viên bồi dưỡng học sinh giỏi biên soạn chương trình, nội dung bồi dưỡng rõ ràng, cụ thể, chi tiết cho khối, lớp, mảng kiến thức rèn luyện kỹ theo số tiết quy định Nhất thiết phải bồi dưỡng theo quy trình từ thấp đến cao, từ dễ đến khó để em học sinh bắt nhịp dần Khi có hứng thú, say mê nghiên cứu, học tập thì việc lĩnh hội tri thức trở nên dễ dàng hơn; ngược lại, nắm bắt vấn đề, tức hiểu người học lại có thêm hứng thú Trên thực tế, người khơng thích, khơng hứng thú học mơn học thường người khơng học tốt mơn học Chính vậy, việc tạo hứng thú cho người học xem yêu cầu bắt buộc làm công tác giảng dạy, môn khoa học 2.2 Thực trạng vấn đề trước áp dụng sáng kiến kinh nghiệm Trước áp dụng đề tài “ Một số thuật toán đặc trưng số học ôn thi học sinh giỏi ngôn ngữ lập trình C++” giáo viên bồi dưỡng học sinh giỏi, thường hay nơn nóng, bỏ qua tập bản, cho khó, học sinh đầu gặp “mớ bịng bong”, khơng nhận nên đâu việc ghi nhớ đơn vị kiến thức kỹ dễ lộn xộn hay kết khơng định hình phương pháp từ đơn giản đến phức tạp, học hoang mang Đôi lại coi đơn lẻ khơng có quy luật chung quan trọng, cho học sinh làm nhiều trước có nguyên tắc chung (coi “thơng minh”), kết học sinh bị rối loạn, không học phương pháp tư theo kiểu đắn khoa học Bên cạnh ngơn ngữ sử dụng ngơn ngữ lập trình Pascal có số hạn chế định so với C++ Thời gian thực câu lệnh nhiều Dữ liệu sử dụng có phần hạn chế hơn… 2.3 Các giải pháp sử dụng để giải vấn đề Dưới số thuật tốn đặc trưng số học ôn thi học sinh giỏi ngơn ngữ lập trình C++ 2.3.1 Số ngun tố: 2.3.1a Kiểm tra tính nguyên tố theo định nghĩa Ý tưởng để kiểm tra số nguyên dương N (N>1) có số ngun tố hay khơng, ta kiểm tra xem có tồn số nguyên k (2 ≤ k ≤ N ) mà k ước N (N chia hết cho k) N khơng phải số nguyên tố, ngược lại N số nguyên tố bool IsPrime(int N) { if (N < 2) return flase; for(int i = 2; i < sqrt(N); i++) if(N%i==0) return flase; return true; } Tuy nhiên ta thấy cách khơng hiệu thời gian kiểm tra lâu Cải tiến kiểm tra tính nguyên tố số N cách kiểm tra xem N có chia hết cho số 2, số số có dạng 6k ± đoạn 5, N  bool IsPrime (int N) {if (N==2 || N==3) return true; if (N==1 || N%2==0 || N%3==0) return false; int k=-1; while (kint(sqrt(N)); } 2.3.1b Kiểm tra số nguyên tố theo xác suất Các khái niệm, tính chất đồng dư thức, định lý cần nhớ định lý Ferma Ở đề cập đến định lý Ferma nhỏ tổng quát hóa định lý Ferma: Định lý Ferma nhỏ Nếu p số nguyên tố, với số nguyên a bất kỳ, ap-a chia hết cho p p Nghĩa a ≡ a (mod p) Một dạng tổng quát định lý là: p số nguyên tố m n m n số nguyên dương thỏa mãn m ≡ n(mod p − 1) , ∀a ∈ Z : a ≡ a (mod p ) Định lý Fermat tổng quát hóa Định lý Euler: với modulo n ϕ (n) ≡ 1(mod n) số nguyên a số nguyên tố với n, ta có: a Trong ϕ (n) kí hiệu hàm phi Euler đếm số số nguyên n nguyên tố với n Đây tổng quát hóa định lý nhỏ Fermat n=p số nguyên tố ϕ ( p) = n − 2.3.1c Liệt kê số nguyên tố đoạn [1,N] Cách Thử số m đoạn [1,N], kiểm tra tính nguyên tố m void OutPrime(int N) { for(int i = 2; i 1&&b[0]=='0') b.erase(0,1); return b; } 2.3.4d Nhân số ngun lớn Phân tích thuật tốn - Duyệt từ cuối xâu a đầu xâu - Tách phần tử xâu a nhân với xâu b (Thuật toán nhân với số nhỏ) - Cộng liên tiếp kết thu (lưu ý trước cộng xâu thêm ký tự “0” vào sau xâu thứ 2) - Xử lý ký tự “0” trước xâu sau cộng Đoạn chương trình tham khảo string Nhanxau(string a, string b) { string x,Tg1="0",Tg2,c; long i,j=0; for(i=b.length()-1;i>=0;i ) { Tg2=Nhan1so(a,(b[i]-48)); Tg2.insert(Tg2.length(),j,'0'); j++; c=Congxau(Tg1,Tg2); 11 Tg1=c; } return c; } 2.3.4e Chia số nguyên lớn cho số nguyên nhỏ Phân tích thuật toán - Bước 1: Duyệt từ đầu xâu số nguyên lớn - Bước 2: + Tách phần tử xâu đem chia cho số nguyên nhỏ: chia = số + dư * 10 (dư ban đầu 0); thương = chia / số nhỏ; dư = chia % 10; + Cộng liên tiếp thương phần nguyên; + Lưu lại giá trị dư cuối phần dư; + Lưu ý: xóa “0” đầu mảng xâu kết Đoạn chương trình tham khảo void chia_so(char a[],long b,char div[],char mod[]) { long i,n=strlen(a),du=0,so,chia,thuong; char tg[10],luu[100000]=""; for(i=0;i Thầy cho em số N em cho biết có phải lũy thừa cao số nguyên tố hay khơng?” Khơng phải lúc mang theo máy tính bên mình, lúc TMB cần bạn Yêu cầu: Cho số N, giúp TMB trả lời câu đố thầy giáo, N lũy thừa cao số nguyên tố in số p q tương ứng, khơng ghi Giới hạn: n ≤ 1018 Input: Một dòng chứa n Output: Một dịng kết Ví dụ Input Output 27 10 33 Hướng dẫn  Duyệt q từ đến 63, ta tính bậc q n, sau làm trịn lũy thừa cho q thử xem có n khơng, ta kiểm tra xem số có phải số ngun tố khơng  Cơng thức tính bậc q n: q q n =n =e ln n q  Ngồi ra, dùng chặt nhị phân để tính Chương trình tham khảo #include #include using namespace std; bool is_prime(long long p) { if (p < 2) return false; if (p == 2) return true; if (p % == 0) return false; for (long long d = 3; d * d > n; for (int q = 2; q < 64; q++) { long long p = round(exp(log(n) / q)); long long nn = 1; for (int i=0; i < q; i++) nn *= p; if (nn == n && is_prime(p)) { cout = 0; i ) if (a[i] != b[i]) return a[i] < b[i]; return false; } int main() { string sa, sb; cin >> sa >> sb; BigInt a = Init(sa); BigInt b = Init(sb); Print(a + b); if (a < b) { printf("-"); Print(b - a); } else { Print(a - b); } Print(a * b); return 0; } Bài GCDMAX- Ước chung lớn nhất[1] Cho dãy a1 , a2 , , an Một dãy b1 , b , , b n gọi đẹp − bi ≤ Một dãy b đẹp đẹp ước chung lớn phần tử lớn tốt Hãy tìm ước chung lớn dãy b đẹp [1]:http://www.mediafire.com/file/asu2zq3qxt84kpy/BAI_12.rar/file Input • Dòng đầu số nguyên dương n ( ≤ n ≤ 50000) 17 • Dịng thứ hai số nguyên dương mô tả dãy a (1 ≤ ≤ 109 ) Output • Một dịng đáp án cần tìm Ví dụ Input 42312 Output Hướng dẫn − Nếu số tự nhiên n có số lượng ước ≤ n − Đề cho ≤ ≤ 109 nên ta có thể: For { ( j = 1; j

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

Tài liệu cùng người dùng

Tài liệu liên quan