1. Trang chủ
  2. » Luận Văn - Báo Cáo

Boi duong HSG tin hoc chuyen de thuat toan

19 10 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

Tên biến nên thể hiện được ý nghĩa: thông thường các biến nguyên như i, j, k dùng làm biến lặp; x, y dùng làm biến lưu tọa độ… Còn những biến lưu trữ khác thì nên đặt tên gợi nhớ: Biến đ[r]

(1)Chuyên đề bồi dưỡng giáo viên tin học THCS Nội dung I Rèn luyện tư thuật toán cho học sinh THCS Tại phải rèn luyện kỹ tìm tòi thuật toán Xác định rõ INPUT và OUTPUT Mịn dần thuật toán II Rèn luyện phong cách lập trình tốt cho học sinh THCS 1.Quy ước cách đặt tên cho các định danh Phong cách viết mã nguồn 4.Tối ưu thực thi mã nguồn Tạo các thử III.Các dạng toán bồi dưỡng môn tin cho HSG THCS 1.Các bài toán số học 2.Các bài toán mảng chiều , hai chiều Các bài toán xử lý xâu I Rèn luyện tư thuật toán cho học sinh THCS Tại phải rèn luyện tư thuật toán cho học sinh THCS Trong sách tiếng mình NNLT Pascal ( viết năm 1970), tác giả N.With đã viết dòng từ trang đầu: CHƯƠNG TRÌNH= THUẬT TOÁN +CẤU TRÚC DỮ LIỆU Như thuật toán là phần quan bậc để tạo nên chương trình Nhưng hết tiểu học, học sinh chưa làm quen với khái niệm thuật toán Do học lập trình cái khó khăn ban đầu học sinh chính là tìm thuật toán để giải bài toán đã cho Một học sinh muốn tiến sâu, tiến xa tương lai phải có tư thuật toán tốt Bởi làm quen và rèn luyện tư thuật toán cho học sinh bắt đầu học lập trình là yêu cầu thiết yếu Không nên vội vàng cho học sinh làm việc (2) trên máy tính luôn bát đầu học Có thầy giáo dạy tin học cho lớp chuyên tin đã bỏ học kỳ để dạy riêng thuật toán II Phong cách lập trình tốt Để có phong cách lập trình tốt ngoài việc tuân theo các quy chuẩn, còn cần phải tuân theo các quy ước Cơ sở cho việc cài đặt chương trình hiệu là: Cách trình bày rõ ràng, sáng sủa bật cấu trúc logic chương trình Một phần nhỏ lập trình là để máy tính có thể đọc nó Phần lớn là viết các mã lệnh cho chương trình chạy theo đúng chức và làm để người có thể dễ đọc, dễ hiểu nó Lợi ích việc trình bày cẩn thận:  Thể tốt cấu trúc lôgic mã lệnh  Cải thiện khả đọc  Bảo đảm chính xác các thay đổi  Các lợi ích hệ các lợi ích trên - Chương trình ít mắc lỗi và dễ sửa chữa mắc lỗi - Tiết kiệm thời gian sửa lỗi - Tăng khả làm việc theo nhóm, Quy ước cách đặt tên cho các định danh Thông thường tùy theo ngôn ngữ và môi trường lập trình, người viết chương trình chọn cho mình phong cách quán việc đặt tên cho các định danh Tuy nhiên, nên đặt cho thuận tiện, dễ đọc, dễ nhớ và dễ làm việc, có số quy tắc cần quan tâm đặt tên sau: a) Đặt tên cho biến Tên biến nên thể ý nghĩa: thông thường các biến nguyên i, j, k dùng làm biến lặp; x, y dùng làm biến lưu tọa độ… Còn biến lưu trữ khác thì nên đặt tên gợi nhớ: Biến đếm số lần dùng “Count” hay “Sluong”; biến trọng lượng “weight” hay “Tluong”… Nếu đặt quá ngắn “c” cho biến đếm hay “w” cho biến trọng lượng thì sau này nhìn vào chương trình khó hiểu và dễ nhầm lẫn, không nên quá dài dòng “Demsoluong” hay “Tinhtrongluong” dùng rườm rà, tốn thời gian viết b) Đặt tên hằng: Tất các ký tự viết hoa Ví dụ: Const MAXN = 10000; INPUT = ‘Baitap.inp’; (3) c) Đặt tên cho chương trình con: Tên chương trình thường bắt đầu chữ hoa Vì chương trình thường thực chức nào đó nên tên hay bắt đầu động từ Ví dụ: TimMax( ); GetNum( ); Phong cách viết mã nguồn a) Quy tắc trình bày tổng thể chương trình: - Chương trình nên tách thành nhiều đơn thể (mô _ đun), đơn thể thực công việc, càng độc lập với càng tốt (chương trình con) Điều này giúp cho chương trình dễ cải tiến và đọc chương trình ta dễ hình dung vấn đề thực - Nên sử dụng các tham số truyền thông tin cho các chương trình Tránh sử dụng các biến toàn cục để truyền thông tin các chương trình vì làm tính độc lập các chương trình và khó khăn kiểm soát giá trị chúng chương trình thi hành - Cách trình bày chương trình càng quán càng dễ đọc, dễ hiểu - Chương trình nên giữ tính đơn giản, rõ ràng - Chương trình nên thực dòng chảy từ trên xuống: + Sau đó đến khai báo đơn vị, khai báo hằng, khai báo kiểu, khai báo biến toàn cục, khai báo chương trình + Không nên sử dụng Goto vì phá vỡ tính việc thực chương trình b) Quy tắc trình bày dòng lệnh - Mỗi câu lênh nên đặt riêng trên dòng để chương trình dễ đọc và dễ quan sát cách thực hiên dùng watch để tìm lỗi - Sử dụng tab để canh lề chương trình (các lệnh ngang cấp thì phải tab vào nhau): Điều này giúp chương trình rõ ràng và dễ quản lý Ví dụ: Không nên For i := to n Begin Action1; Action2; Nên For i := to n Begin End; Action1; Action2; Nên viết Begin - End; end; viết lệnh vào để tránh thiếu end; Sử dụng khoảng trắng chương trinh dễ nhìn hơn: Ví dụ: Khó đọc If (a<c)and(c mod 2=0)then d:=a+c; a:=b*c Dễ đọc If ( a < c ) and ( c mod = ) then d := a + c; a := b * c; (4) TimMax(a,b,c); TimMax(a, b, c); - Nên định nghĩa số: Điều này tránh việc các số khó hiểu xuất chương trình và giúp người lập trình dễ kiểm soát chương trình lớn vì giá trị số cần thay đổi phải thay đổi lần giá trị định nghĩa Ví dụ: Không nên Nên …………… Const For i := to 100 A[i] := Random(100); While i<=100 do… MAXN = 100; MAXNUM = 100; …… For i :=1 to MAXN A[i] := Random(MAXNUM); While i <= MAXN … Ở đoạn chương trình bên trái khó phân biệt các số 100 có quan hệ gì với Tuy nhiên, đoạn chương trình bên phải ta dễ dàng thấy ý nghĩa giá trị thay định danh Ngoài cần thay đổi giá trị MAXN, MAXNUM thì cần thay lần phần định nghĩa - Các biến không nên sử dụng lại với nhiều ý nghĩa khác cùng hàm để tránh nhầm lẫn - Viết chú thích cho chương trình: Biến, hàm định nghĩa nên viết chú thích ý nghĩa và chức rõ ràng Đôi các đoạn lệnh thực thi cần giải thích chúng quá phức tạp Nên viết chú thích ngắn gọn đầy đủ và dễ hiểu Ví dụ: Var Procedure iCount : Integer; // đếm số cách thực Try( i : Integer); // Tìm từ i Tuy nhiên không phải lệnh nào chú thích, việc chú thích tràn lan với câu lệnh đơn giản không có ý nghĩa gì mà còn làm chương trình khó nhìn - Nên viết biểu thức điều kiện mang tính tự nhiên: Biểu thức nên viết dạng khẳng định, việc viết dạng phủ định làm khó hiểu Ví dụ: Không nên If not(a mod 5<>0) then … Nên If a mod = then … c) Qui tắc khai báo tên tệp liệu dùng chương trình Dùng tệp nên khai báo tên têp trước phần khai báo hằng: (5) Ví du: Const fi=’BAI1.INP’; Fo=’BAI1.OUT’ ; Tối ưu thực thi mã nguồn Mục đích việc tối ưu mã nguồn là nâng cao tốc độ xử lý và hạn chế không gian nhớ mà chương trình chiếm dụng Thông thường có thể mâu thuẫn tốc độ và không gian lưu trữ, đó tùy theo điều kiện cụ thể mà người lập trình có lựa chọn thích hợp Một số thủ thuật sau có thể giúp người lập trình hình thành nên phong cách lập trình tốt - Lưu tạm giá trị thường sử dụng: Nếu biểu thức tính toán dùng nhiều lần thì nên tính kết lần lưu vào biến và dùng lại Ví dụ: Không nên Nên x2 := x*x; F:=sqrt(x*x+y*y)+(sqrt(x*x+y*y)*sqrt(x*y)-sqrt(y*y); y2 := y*y; p := sqrt(x2 + y2); If b * b – * a * c >0 then Begin F := p + (q * sqrt(x2) – sqrt(y2)); Delta := b * b – * a * c If delta >0 then x1 := (-b +sqrt( b * b – * a * c)) / (2 * a); Begin x2 := (-b – sqrt(b * b – * a * c)) / (2 * a); Delta:=sqrt(delta); end; x1 := (-b + delta) / (2 * a); x2 := (-b – delta) / (2 * a); end; - Thay biểu thức biểu thức tương đương lợi thực thi: Ví dụ: Thay các phép nhân chia phép dịch chuyển bit vì các phép xử lý bit tốc độ nhanh các phép xử lý khác Không nên For i := to n s:=s*2; - nên s shl n; Dùng số nguyên thay cho số thực: Do việc xử lý số thực chậm xử lý số nguyên nên ta có thể dùng số nguyên thay cho số thực có phần lẻ nhỏ Vì dụ: Điểm trung bình học sinh là số thực ta có thể thay số nguyên: DTB là 7.85 thì lưu số nguyên là 785, xuất thì chia cho 100 (6) - Thoát khỏi vòng lặp sớm nhất: Một số trường hợp không cần thiết phải lặp hết toàn mà đã đạt mục đích thì có thể thoát khỏi vòng lặp Ví dụ: Hạn chế sử dụng câu lệnh rẽ nhánh: Lệnh rẽ nhánh làm chậm chương trình ngắt luồng thực thi Không nên bkt := true; Ví dụ: For i := to n Không nên If x > y then d:= False; If n d:=True mod i = else then - Tránh bkt := False; For i := to n Nên d := x>y; If n mod i = then Begin nhớ: cách Nên bkt := true; sử liệu lãng phí bkt := False; Bằng Break; dụng kiểu End; nhỏ đủ để lưu trữ Việc sử dụng tài nguyên nhiều mức đòi hỏi chương trình là thói quen xấu mà người lập trình hay mắc phải Hơn tốc độ chương trình nhanh sử dụng kiểu liệu nhỏ - Khai báo biến cục phạm vi gần nhất: Khai báo biến cục gần với điểm sử dụng Việc khai báo phạm vi rộng làm lãng phí và khó kiểm soát - Giảm số lượng tham số truyền vào hàm: Việc sử dụng hàm có quá nhiều tham số truyền vào có thể làm ảnh hưởng đến ngăn xếp dành cho việc gọi hàm Nhất là trường hợp tham số là kiểu liệu có cấu trúc Sử dụng trỏ hay tham chiếu trường hợp này để đơn giản hóa 4) Kiểm nghiệm chương trình với các test đầy đủ - Test đầu bài, - Các test đơn giản - Test các trường hợp đặc biệt (7) - Test lớn - Xem lại đề để không bỏ sót trường hợp III Các dạng toán bồi dưỡng môn tin cho HSG THCS Nhóm các bài toán lập trình thường phân loại theo thuật toán, theo cấu trúc liệu dùng để giải Ở bậc THPT dạng toán phong phú nhiều mở rộng CTDL song song với việc mở rộng thuật toán Ở bậc trung THCS các bài toán thường sử dụng các vòng lặp, sử dụng các kiến thức toán UCLN , BCNN, số nguyên tố, chia hết các số nguyên,…Các dạng toán thường gặp là:  Nhóm các bài toán số học:  Nhóm các bài toán thao tác trên mảng chiều  Nhóm các bài toán xử lý xâu  Các bài toán khác Các bài toán số học Để giải các bài toán số học giáo viên cần cho học sình ứng dụng nhuần nhuyễn các kiến thức số học THCS chủ yếu dựa vào phép toán DIV, MOD:  Thuật toán tìm UCLN số nguyên dương: Cho số nguyên dương m, n Tìm UCLN(m,n) Học sinh thường dùng thuật toán Thuật toán 1: Sử dụng phép trừ liên tục số nhau: + Nhập m, n + While m<>n If m>n then m:=m-n Else n:=n-m; +UCNN:=n; Thuật toán này chạy chậm: Ví dụ với m=1000000000, n=1 phải chạy tỷ phép toán (8) Thuật toán 2: (Đối với HSG nên hướng các em sử dụng thuật toán này) + Nhập m, n + While n <> Begin r:= m mod n m:=n; n:=r; End; +UCLN:=m Với thuật toán này m=1000000000, n=1, vài phép toán để tính UCLN(m,n) Để tìm UCLN dãy a1, a2,…,an, cần lập hàm: FUNCTION UCLN(a, b: longint): longint; Khi đó + d:=a1; + for i:=2 to n Begin b:=ai; d:=UCLN(d, b);End;  Thuật toán tìm BCNN số: Ta có BCNN(m,n)= (m * n) div UCLN(m, n) Ở đây học sinh thường mắc sai lầm sau : Sai lầm : d :=UCLN(m, n) ; BCNN :=m*n div d ; Đúng phải là : BCNN :=m * n (lưu tích m.n) d := UCLN(m, n) ; BCNN := BCNN div d Sai lầm : BCNN(m, n, k) = m*n*k div UCLN(m, n k) Để tìm BCNN dãy số nguyên dương a1, a2, …,an (n>=2) BCNN:=a1; d:=a1; For i:=2 to n n Begin (9) b:=ai BCNN:=BCNN*b; d:=UCLN(BCNN,b); BCNN:=BCNN div d ; End ;  Kiểm tra số nguyên tố Cho số nguyên P Hỏi P có phải là số nguyên tố không? Nhiều học sinh lập thuật toán đếm số ước P Nếu số ước P là thì kết luận P là số nguyên tố Thuật toán đó không sai chậm FUNCTION Ngto(P:Integer): Boolean; Var NT:Boolean; I:integer; Begin NT:=P>1; For i:=2 to Trunc(Sqrt(P)) If P mod I =0 then Begin NT:=False; Break End; Ngto:=NT; End;  Đếm số chữ số số, tính tổng các chữ sô Bài toán : Nhập số nguyên n Số n có bao nhiêu chữ sô Tính tổng các chữ số n +TongCS:=0; SoCS:=0; + While n<>0 Begin Inc(SoCS); TongCS:=TongCS+ n mod 10; (10) n := n div 10 ; End ;  Biểu diễn số tự nhiên n từ hệ đếm thập phân qua các hệ đếm khác và ngược lại Bài toán : Cho n là số nguyên dương biểu diễn hệ thập phân Hãy biểu diễn n hệ đếm q – phân ( 1<q<10) Dùng mảng : array[0 20] of byte ; + d:=-1; + While n<>0 Begin Inc(d); a[d]:= n mod q n:=n div q; End; { lưu dãy chữ số q- phân theo thứ tự ngược} + for i:=d downto write(a[i]); Một số bài toán số học Bài Phân tích thừa số nguyên tố Cho số tự nhiên n (n>1) Hãy phân tích n thành tích các thừa số nguyên tố Ví dụ: Cho n=12 thì n=2.2.3, cho n=300 thì n=2.2.3.5.5 + Phân tích: Chỉ cần duyệt qua các ước nguyên tố từ bé đến lớn ghi + Thuật toán: If Ngto(n) then writeln(n) Else Begin m:=n; For p:=2 to n div If Ngto(p) then Begin While m mod p = write(p,’.’); (11) m:= m div p; End; Bài Rút gọn phân số Cho phân số a/ b đó a nguyên còn b là số tự nhiên khác không Hãy tìm số c, d cho phân số c/ d tối giản và a/b=c/d + Phân tích: Đây là bài toán đơn giản, phải chú ý số a có thể âm + Thuật toán: Dau:=1; If a<0 then dau:=-1 ; a:=abs(a); c:=a div UCLN(a,b); d:=b div UCLN(a, b); Writeln(dau*c,’/ ‘, d); Bài Giai thừa Cho số tự nhiên n P=n! Hỏi: a/ P có bao nhiêu chữ số không tận cùng b/ Số khác tận cùng P là số nào +Phân tích : a/ Số chữ số cuối cùng chính là số ước 10 P! mà p!=a.10k=a.2k.5k Do số ước nhiều ước 5, nên số tân cùng là k Vậy ta cần tính số lượng ước P ! + Thuật toán: s5:=0; For m:=5 to n Begin K:=m; While k mod = Begin Inc(s5); k:=k div End; End; In kết : S5 (12) b/ Câu này dễ mắc sai lầm vừa nhân vừa xóa cuối và giữ lại chữ số khác cuối cùng + Thuật toán: Giả sử So2, so5 là số lượng ước và ước P S2:=0; S5:=0; P:=1; For m:=2 to n Begin K:=m; While K mod = Begin inc(so2), k:= k div End; While K mod = Begin inc(so5), k:= k div End; P:=P* K mod 10 End For i:= to so2-so5 Begin p:=p * mod 10 In kết : P Bài Tính tổng chữ số (Đê thi HSG thành phố Hà nội năm 2010) Một sách có n trang Hỏi a/ Tổng tất các chữ số đã ghi trên các trang sách b/ Mỗi chũa số xuất bao nhiêu lân Thuật toán : + Lập hàm TongCS(K) để tính tổng các chữ số K + Dùng mảng a[0], a[1],…,a[9], đó a[i] số lần xuất chữ số i: + Sum:=0; fillchar(a, sizeof(a),0); + For m:=1 to n Begin K:=m; Sum:=Sum+TongCS(K); While K <> Begin Inc( a[ k mod 10]) (13) K:=K div 10 End; In kết quả: Sum, a[0],…, a[9] Bài Phân tích (Thi HSG MOSKVA) Cho số tự nhiên n Hãy phân tích n =A+B cho UCLN(A, B) là lớn Với 2≤ n≤ 109 Bài Số nguyên tố Cho số tự nhiên n>1 Tìm số k nguyên tố không vượt quá n các trường hợp sau: a) k lớn b) k có tổng các chữ số lớn c) k là số đối xứng lớn ( k là số đối xứng đọc số đó từ trái qua phải hay từ phải qua trái Ví dụ: các số 373, 3, 979…là các số đối xứng) Input cho tệp NT.INP:- gồm dòng ghi số nguyên n (1<n<1000001) Output ghi vào tệp NT.OUT: gồm dòng, ghi số tương ứng cách dấu cách là đáp số câu a, b, c Câu nào không tìm kết thì ghi số thay Ví dụ: NT.INP NT.OUT 100 97 89 11 Bài Số siêu nguyên tố (Đề thi HSG Thành phố) Số P gọi lầ số siêu nguyên tố, nó nguyên tố và ta bỏ các chữ số hàng đơn vị từ tái qua phải thì số nhận là số nguyên tố Ví dụ: 239 là số siêu nguyên tố vì 239 là số nguyên tố và 23, là các số nguyên tố , còn 431 là số nguyên tô, 43 là số nguyên tố, không nguyên tố nên 431 không phải là số siêu nguyên tố Cho số n (0<n<10) Hãy đếm số lượng các số siêu nguyên tố có n chữ số Lời giải • Phương án 1: Duyệt toàn bộ: + Tìm số nhỏ lớn có n chữ số Chẳng hạn với n=3 thì số nhỏ và lớn có chữ số là: n1=100 và n2=999 (14) + Dùng biến chạy p: For p:= n1 to n2 If p thỏa mãn then tăng biến đếm + Thuật toán này 40 % số test • Thuật toán tốt +If n=1 thì a[1]:=2;[2]:=3; a[3]:=5, a[4]:=7; slg:=4 + If n>1 then Begin c[1]:=1; c[2]:=3; c[3]:=7; c[4]:=9;scs:=1; Repeat inc(scs); tg:=0; fillchar(b, sizeof(b),0) For k:=1 to slg For g:=1 to Begin if NT(a[k]*10+c[g]) then Begin inc(tg); b[tg]:= NT(a[k]*10+c[g]) End End; a:=b;Slg:=tg; tg:=0; Until scs=n End; {kết là Slg} Bài p Phân số ( Đề thi HSG thành phố Hà nội) p Phân số q ( p, q là số nguyên dương) gọi là phân số đúng q gọi là phân số tối giản UCLN(p,q)=1 Yêu cầu: Cho trước số nguyên n (3≤ n ≤ 50000000) p a) Tính số lượng các phân số đúng, tối giản q p b) Tìm phân số đúng, tối giản q p <1 Còn q mà p+q=n lớn mà p+q=n Nhóm các bài toán mảng Trong phần này gv cần cung cấp cho học sinh số kỹ thao tác trên mảng như: Tìm phần tử MAX, MIN, xếp đơn giàn, kiểm tra tinh đơn điệu dãy, tìm kiếm trên dãy… Bai1 Trong buổi sinh hoạt câu lạc Tin học Cung thiếu nhi Hà Nội, thầy giáo bài toán sau: Từ số hạng đầu tiên dãy số Fibonacci (là dãy số có (15) quy luật: số hạng thứ và thứ hai 1, từ số hạng thứ ba trở tổng hai số hạng đứng trước nó) thành lập dãy số gồm số cách thay số hạng số dư số hạng đó chia cho 100 Ví dụ, với ta có 13 số hạng đầu tiên dãy số Fibonacci là: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 Dãy số nhận sau thay là: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 44, 33 Để kiểm tra bài làm, thầy giáo yêu cầu các bạn trả lời hai thông tin sau: • Số hạng thứ dãy là số nào? • Có bao nhiêu giá trị khác dãy số mới? Nhập vào từ file FIBO.INP số nguyên dương n Xuất màn hình: + Dòng 1: in số hạng thứ dãy + Dòng 2: in số lượng các giá trị khác dãy Ví dụ: Nhập Kết màn hình Giải thích 33 Số hạng thứ 13 dãy là số 33 12 Có 12 giá trị khác dãy số Lời giải: • +Dùng mảng : a[0], a[1], a[2],…, a[99]; • A[i]=0 I không xuất dãy rút gọn), a[i]=1 I xuất dãy + If (n=1) or (n=2) then writeln (1,’ ‘, 1); Else Begin a:=1; b:=1; d:=2; Repeat Inc(d); I c:=(a+b) mod 100; a:=b;b: =c; If a[c] =0 then a[c]:=1; Until d=n; End; {In C, a[0]+a[1]+…+a[99]} Bài Tổng max Cho dãy n số nguyên dương a1, a2,…an Hãy tìm số ai, aj, cho i≠j và ai+aj đạt max (16) Lời giải: • Thuật toán 1: Duyệt toàn bộ: + Max:=a1+a2; + For i:=1 to n-1 For j:=i+1 to n If Max<ai+ aj then Max:=ai+aj Thuật toán này có độ phức tạp O(n2) Khi n=10000, thuật toán không hiệu • Thuật toán : Sắp xếp + Sắp xếp giảm dần a1, a2, a3,… +Max:=a1+a2 Độ phức tạp TT này là O(n 2) Tuy nhiên học sinh biết PP xếp nhanh thì tốc độ xử lý tốt (O(nlogn)) • Thuật toán Tìm số lớn thứ thứ nhì + maxi:=1; for I:=2 to n if maxi<a[i] then maxi:=I; m:=a[maxi]; a[maxi]=-maxint; +maxj:=1; for I:=2 to n if maxj<a[i] then maxj:=I; Đáp số : m+a[maxj] • Thuật toán (Xử lý luôn đọc liệu) +Readl(f,n) {n >1}; Read (f, a,b); {gọi max1, max2 là số lớn và bé a,b} +If a>b then Begin max1:=a; max2:=b End Else Begin max1:=b; max2:=a End + For i:=3 to n Begin Read(f, c); If c>= max1 then Begin max2:=max1; max1:=c End Else If c>= max2 then max2:=c; End; { Đáp số là max1+max2 Bài Bao nhiêu điểm (17) Trong thi đấu thể thao n người tham gia Người thứ I có điểm là Biết có đủ các giải ,nhì, ba và người có điểm ngang có giải và ngược lại An giảI Hỏi số điểm An là bao nhiêu Ví dụ: Input n=6, a: 10 10 Output: Lời giải: • • • • • • Thuật toán: +sắp xếp giảm dần +i:=1; + While a[i+1]=a[i] i:=i+1; + i:=i+1; +While a[i+1]=a[i] i:=i+1; Đáp số : a[i+1] Nhóm các bài toán xử lý xâu Để giải các bài toán xâu cần cho học sinh nắm vững các hàm, thủ tục xử lý xâu hàm COPY(), LENGTH(), INSERT(), STR() , VAL()… Bài Tìm số (Đề thi HSG thành phố Hà nội 2011) Cho xâu S, đó có chứa số cụm số Không có quá chữ số liên tuc S Hãy tìm xâu S, biểu diễn số nguyên tố lớn Ví dụ S = ‘tesst1234#password5426’ Số cần tìm là 23 Bài Mật Một mật gọi là an toàn loại nó có ít ký tự và đó phải có đủ loại : chữ cái hoa, chữ cái thường, chữ số Mật gọi là an toàn loại thêm điều kiện nó chứa chữ cái hoa khác nhau, chữ cái thường khác và có chữ số khác Cho trước xâu S dài không quá 255 ký tự bao gồm chữ cái hoa, chữ cái thường và chữ số Yêu cầu: (18) a) Trong S có bao nhiêu chữ cái hoa khác nhau, chữ cái thường khác và bao nhiêu chữ số khác nhau? b) Chọn xâu (gồm các ký tự liên tục) S có độ dài ngắn cho xâu vừa chọn có thể dùng làm mật an toàn loại c) Chọn xâu (gồm các ký tự liên tục) S có độ dài ngắn cho nó có thể dùng làm mật an toàn loại Input cho tệp MK.INP gồm dòng ghi xâu S Output ghi vào tệp MK.OUT : - Dòng ghi số nguyên (cách bới dấu cách) là đáp số tương ứng câu a) - Dòng ghi số là độ dài ngắn mật loại và loại tương ứng tìm (nếu không có ghi số 0) Ví dụ: MK.INP dserwGasddasddda2453dssa Asdg5HgHvH4c MK.OUT 12 25 11 BÀI SẮP XẾP TĂNG Cho xâu S chứa không quá 255 ký tự gồm các chữ cái tiếng anh thường và chữ số, đó có ít chữ số Các chữ số S tạo thành số tự nhiên có nghĩa, tức là không xét đến các chữ số vô nghĩa đầu Yêu cầu: a/ Tính số lượng các chữ số khác có mặt dãy b/ Sắp xếp tăng dần các số xâu sau loại bỏ các số vô nghĩa đầu số Các kí tự khác giữ nguyên thứ tự Giả thiết xâu S có không quá chữ số liên tục Dữ liệu: Vào từ tệp văn SXT.INP gồm dòng ghi xâu S Kết quả: Ghi tệp văn SXT.OUT: - Dòng ghi số lượng các chữ số khác có mặt dãy - Dòng ghi xâu S sau đã xếp lại các số, các kí tự khác số giữ nguyên thứ tự Ví dụ: SXT.INP SXT.OUT a212921hda456e3b a3hda456e212921b SXT.INP t994a0046ui00t148 x SXT.OUT t0a46ui148t994x Lời giải: a/ Dùng mảng a[0 9] , a[i]=0 I không có mặt, a[i]=1 I có mặt b/+ Tách số và chèn dấu * vào vị trí số: so[1]=994, so[2]=0046, s0[3]=00, so[4]= 148  S=t*a*ui*t*x (19) + Chuẩn và sếp tăng: so[1]=0, so[2]=46, so[3]=148, so[4]= 994 + Lần lượt thay dấu * so[1], so[2],… => S=t0a46ui148t994x - (20)

Ngày đăng: 07/09/2021, 04:39

Xem thêm:

TỪ KHÓA LIÊN QUAN

w