Tải bản đầy đủ (.docx) (33 trang)

Chu de 19 2015

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (158.35 KB, 33 trang )

<span class='text_page_counter'>(1)</span>LUYỆN THI HỌC SINH GIỎI MÔN TIN HỌC Thời gian làm bài: 150 phút. CHỦ ĐỀ 19 THUẬT TOÁN SINH. TT 1 2 3. Tên bài Bội số chỉ gồm 1 hoặc 0 Tạo dãy tăng Tìm dãy số. Tổng quan Tệp Tệp dữ liệu chương trình. Tệp kết quả. Thời Gian. BS1H0.PAS. BS1H0.INP. BS1H0.OUT. 1s/test. TAODT.PAS TIMDS.PAS. TAODT.INP TIMDS.INP. TAODT.OUT TIMDS.OUT. 1s/test 1s/test. Bài 1. (6 điểm) BỘI SỐ CHỈ GỒM 1 HOĂC 0 Cho số nguyên dương N (N <= 100000). Yêu cầu: Tìm số nguyên dương M là bội số của N, sao cho trong biểu diễn thập phân của M chỉ chứa các chữ số 1 hoặc 0. Dữ liệu: Đọc vào từ tệp BS1H0.INP, gồm nhiều phương án, mỗi phương án trên một dòng, trên dòng đó ghi số N. Kết quả: Ghi ra màn hình và ghi ra tệp DT3D.OUT, mỗi phương án trên một dòng, trên dòng đó ghi 4 số - Số sln là số chữ số của M. - Số M tìm được. - Số sltg là số chữ số của thương khi chia M cho N. - Số thương nhận được khi chia M cho N.. Ví dụ:. BS1H0.INP 3 77. BS1H0.OUT 3 111 2 37 4 1001 2 13. Bài 2. (7 điểm) TẠO DÃY TĂNG Dãy số X = (x1, x2, .., xi) được gọi là dãy tăng nếu x1 < x2 < ... < xi-1 < xi. Dãy tăng X = (x1, x2, .., xi) được coi là nhỏ hơn dãy tăng Y = (y1, y2, .., yj) (ký hiệu là X < Y) nếu tìm được số nguyên k sao cho với mọi l <= k đều có xl = yl còn xk+1 < yk+1. (Dãy có ít phần tử hơn cần bổ sung thêm các số 0 ở cuối để có số phần tử bằng số phần tử của dãy kia, trước khi so sánh). Các dãy tăng sinh ra từ N là các dãy tăng tạo bởi các số (1, 2, ..., N), được sắp xếp theo thứ tự nêu trên và được đánh số thứ tự từ 1 đến 2N – 1. Ví dụ: với N = 3 ta có 7 dãy tăng, theo thứ tự là {1}, {1, 2}, {1, 2, 3}, {1, 3}, {2}, {2, 3}, {3} Yêu cầu: - Cho biết 2 số NK và TTK, tìm dãy tăng DK, có thứ tự TTK tạo ra từ NK. - Cho biết số ND và dãy tăng DV, tìm thứ tự TTD của DV trong các dãy tăng tạo ra từ ND. Dữ liệu: Đọc vào từ tệp TAODT.INP, gồm nhiều phương án, mỗi phương án trên hai dòng, dòng thứ nhất ghi 2 số NK và TTK, dòng thứ hai ghi số ND, tiếp đó là các số của dãy DV. Kết quả: Ghi ra màn hình và ghi ra tệp TAODT.OUT, mỗi phương án trên hai dòng, - Dòng thứ nhất ghi số slr là số lượng phần tử của dãy DK tìm được, sau đó ghi các giá trị của dãy DK, để trong cặp ngoặc vuông. - Dòng thứ hai ghi số spt là số phần tử của dãy DV đọc được, tiếp đó ghi số TTD là thứ tự của dãy DV đó. Ví dụ: TAODT.INP TAODT.OUT 42 2 [1 2] 512 22 5 13 3 [1 3 5] 623 2 34 Bài 3. (7 điểm) TÌM DÃY SỐ.

<span class='text_page_counter'>(2)</span> Cho trước 2 số nguyên dương N và M (N, M < 10). Các dãy số nguyên dương có không quá N phần tử khác nhau, tạo thành từ M chữ số (1, 2, ..., M), được sắp xếp theo thứ tự từ điển và được đánh số thứ tự từ 1 đến hết (sau đây sẽ gọi tắt là danh sách N, M). Ví dụ: với N = 2, M = 3 ta có 9 số theo thứ tự là 1, 12, 13, 2, 21, 23, 3, 31, 32. Ta nói rằng dãy A = (a1, a2, .., ap) nhỏ hơn dãy B = (b1, b2, .., bq) trong thứ tự từ điển, và viết là A < B, nếu tìm được số nguyên dương i >=1 sao cho aj = bj với mọi 1 <= j < i và ai < bi. (Dãy có ít phần tử hơn cần được bổ sung các số 0 vào cuối trước khi so sánh). Yêu cầu: Cho biết 3 số NT, MT và TT. Cần tìm dãy số DT ở vị trí thứ TT trong danh sách NT, MT nói trên. Dữ liệu: Đọc từ tệp văn bản TIMDS.INP, gồm nhiều phương án, mỗi phương án ghi trên 1 dòng, trên dòng đó ghi 3 số NT, MT, TT. Kết quả: Ghi ra màn hình và ghi ra tệp văn bản TIMDS.OUT, mỗi phương án trên 1 dòng, trên dòng đố ghi số slr là số phần tử của dãy DT, tiếp đó ghi các phần tử của dãy DT, để trong cặp ngoặc vuông.. Ví dụ:. TIMDS.INP 233 237. TIMDS.OUT 2 [1 3] 1 [3]. TÓM TẮT LÝ THUYẾT 1. Thuật toán sinh kế tiếp Thuật toán sinh kế tiếp thường được dùng để sinh ra một dãy giá trị kế tiếp với dãy giá trị đã có, nhờ đó có thể sinh ra tất cả các dãy giá trị có thể có để xem.

<span class='text_page_counter'>(3)</span> xét và lựa chọn ra dãy giá trị phù hợp, thỏa mãn yêu cầu bài toán. Ví dụ: Với Bài 1: - Các dãy cần xét là các dãy số mà mỗi chữ số là 0 hoặc 1. - Dãy phù hợp là dãy tạo thành số hệ 10, chia hết cho N. Với Bài 2: - Các dãy cần xét là các hoán vị của N chữ cái. - Dãy phù hợp là dãy đứng ngay sau và dãy đứng ngay trước dãy đã cho. Với Bài 3: - Các dãy cần xét là các hoán vị của N chiều cao cây cần trồng. - Dãy phù hợp là dãy cho tổng độ chênh lệch là nhỏ nhất. Thuật toán sinh kế tiếp đòi hỏi phải xác định được hai yếu tố sau: 1) Có một thứ tự để có thể sắp xếp các dãy số từ “nhỏ” đến “lớn”. 2) Có quy tắc để tạo ra dãy tiếp theo dãy đã có trong thứ tự đó. 2. Thứ tự từ điển giữa các dãy số nguyên không âm Thứ tự giữa các dãy số nguyên không âm, thường gọi là thứ tự từ điển (vì nó tương tự như thứ tự của các từ trong một quyển từ điển). Trước hết, nếu hai dãy số có số phần tử bằng nhau (cùng bằng n) thì Dãy số X = (x1, x2, .., xn) được coi là “nhỏ hơn” dãy số Y = (y1, y2,..,yn) nếu tìm được chỉ số k (1 <= k < n) để cho x1 = y1, x2 = y2, .., xk = yk và xk+1 < yk+1. Khi số k nói trên bằng n thì ta nói dãy X “bằng” dãy Y. Nếu số phần tử của 2 dãy không bằng nhau thì dãy ít phần tử hơn được thêm các giá trị 0 vào cuối để có số phần tử bằng dãy kia, và việc so sánh được tiến hành với dãy đã bổ sung. Ví dụ: Với X = (1, 2, 3, 4) và Y = (1, 2, 4, 3) thì X < Y (k = 2). Với X = (1, 2, 4) và Y = (1, 2, 4, 3) thì X < Y (k = 3). Với X = (1, 2, 3, 4) và Y = (1, 2, 3, 4) thì X = Y (k = 4). 3. Sinh kế tiếp dãy 0 - 1 Với dãy nhị phân, giá trị của các phần tử chỉ là 0 hoặc 1. Ví dụ: Với N = 3 ta có 8 dãy nhị phân là (0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1). Khi biết 1 dãy nhị phân, thuật toán sinh dãy nhị phân kế tiếp với dãy đó khá đơn giản: 1) Đổi tất cả các số 1 ở cuối dãy thành số 0. 2) Đổi số 0 ngay trước đó thành số 1. Chú ý: - dãy nhị phân cuối cùng có độ dài dd là dãy gồm dd số 1 - có tất cả 2dd dãy nhị phân độ dài dd, bởi vậy, khi cần liệt kê tất cả các dãy nhị phân có độ dài dd, chỉ nên dùng thuật toán sinh kế nếu dd nhỏ, với dd lớn hơn 30, cần dùng các thuật toán khác. 4. Sinh các dãy tăng từ tập N = (1, 2, .., N) Dãy số X = (x1, x2, .., xn) được gọi là dãy tăng nếu thỏa mãn điều kiện x1 < x2 < .. < xn. Trên tập các dãy tăng gồm không quá N phần tử khác nhau từ tập số N = (1, 2, .., N) cũng có thứ tự từ điển. Ví dụ: Với N = 3, ta có 7 dãy tăng, theo thứ tự là (1), (1, 2), (1, 2, 3), (1, 3), (2), (2, 3), (3) Khi biết 1 dãy tăng T, ta có thể sinh dãy tăng kế tiếp nó theo cách sau: - Gọi sl là số phần tử của dãy C đã có. 1) Nếu T[sl] < N thì tăng sl, đặt T[sl] = T[sl-1] + 1. 2) Trái lại thì giảm sl, tăng T[sl]. 5. Sinh dãy số chứa không quá N phần tử khác nhau từ tập M = (1, 2, .., M) Trên tập các dãy số gồm không quá N phần tử khác nhau từ tập số M = (1, 2, .., M) cũng có thứ tự từ điển. Ví dụ: Với N = 2, M = 3, ta có 9 dãy theo thứ tự là (1), (1, 2), (1, 3), (2), (2, 1), (2, 3), (3), (3, 1), (3, 2) Khi biết 1 dãy C, ta có thể sinh dãy kế tiếp nó theo cách sau: - Gọi sl là số phần tử của dãy C đã có, gtm là giá trị mới (chưa dùng ở C)..

<span class='text_page_counter'>(4)</span> 1) Nếu sl < N thì đặt C[sl + 1] = gtm 2) Nếu sl = N nhưng C[sl] < gtm thì đặt C[sl] = gtm. 2) Nếu sl = N nhưng C[sl] > gtm thì - Tìm chỉ số i lớn nhất thỏa mãn C[i] < C[i + 1] - Giảm i; - Đặt C[i] = C[i] + 1. - Tăng C[i] cho đến khi C[i] chưa có trong phần trước i của dãy. - Đặt lại sl = i.. GIỢI Ý CÁCH GIẢI Bài 1. - Vì bội số M của N chỉ gồm các chữ số 1 hoặc 0 nên số chữ số của M không thể nhỏ hơn số chữ số của N. - Xuất phát từ dd = số chữ số của N. 1) Khởi tạo mảng M gồm dd số 0 rồi đặt M[1] = 1. 2) Kiểm tra xem dãy M đó có tạo thành số hệ 10 chia hết cho N không, Nếu chia hết thì nhớ lại thương của phép chia đó và kết thúc. Nếu không chia hết thì - Nếu M chưa phải là dãy nhị phân cuối cùng có độ dài dd thì.

<span class='text_page_counter'>(5)</span> Sinh dãy nhị phân tiếp theo có độ dài dd (xem mục 3. phần Tóm tắt lý thuyết), rồi lặp lại từ bước 2). - Nếu M là dãy nhị phân cuối cùng có độ dài dd thì đặt dd = dd + 1 và quay lại bước 1. Chú ý: Phép chia ở đây là chia số nguyên lớn (xem lại Bài 3, Chủ đề 17). Bài 2. 1) Tìm dãy tăng khi biết thứ tự TK của nó - Khởi tạo dãy tăng DK đầu tiên chỉ gồm 1 số 1, đặt tt = 1, sl = 1. - Lặp lại khi tt < TK Sinh dãy tăng kế tiếp (xem mục 4. phần Tóm tắt lý thuyết) Tăng tt - Dãy nhận được khi kết thúc vòng lặp trên chính là dãy tăng cần tìm. 1) Tìm thứ tự TD của dãy tăng DV đã cho - Khởi tạo dãy tăng a đầu tiên chỉ gồm 1 số 1, đặt TD = 1, sl = 1. - Lặp lại khi a <> DV Sinh dãy tăng kế tiếp (xem mục 4. phần Tóm tắt lý thuyết) Tăng TD - Số TD nhận được khi kết thúc vòng lặp trên chính là thứ tự của dãy tăng DV. Bài 3. Tìm dãy số khi biết thứ tự T của nó - Khởi tạo dãy tăng D đầu tiên chỉ gồm 1 số 1, đặt tt = 1, sl = 1. - Lặp lại khi tt < T Sinh dãy số kế tiếp (xem mục 5. phần Tóm tắt lý thuyết) Tăng tt - Dãy nhận được khi kết thúc vòng lặp trên chính là dãy số cần tìm.. DỮ LIỆU ĐỂ KIỂM TRA BÀI 1 Tệp BS1H0.INP 3 77 579 653 9175 59 1779 77919 Tệp BS1H0.OUT.

<span class='text_page_counter'>(6)</span> 3 111 2 37 4 1001 2 13 5 11001 2 19 5 11101 2 17 6 110100 2 12 8 11011111 6 186629 11 10010111001 7 5626819 19 1011000111010010001 14 12975013937679. DỮ LIỆU ĐỂ KIỂM TRA BÀI 2 Tệp TAODT.INP 4 2 5 1 2 5 13 6 2 3 6 14 7 2 3 4 7 15 8 2 4 8 16 9 3 9 17 10 3 4 10 18 9 4 9 19 8 3 4 5 Tệp TAODT.OUT 2 [1 2] 2 2 3 [1 3 5] 2 34 4 [1 2 4 6] 3 67 5 [1 2 3 5 7] 2 162 6 [1 2 3 4 6 8] 1 385 7 [1 2 3 4 5 7 9] 2 770 8 [1 2 3 4 5 6 8 10] 1 449 7 [1 2 3 4 5 8 9] 3 195. DỮ LIỆU ĐỂ KIỂM TRA BÀI 3 Tệp TIMDS.INP 2 3 3 2 3 7 3 3 8 3 3 14 4 4 9 4 4 17 4 4 31 4 4 59 4 5 38 4 5 64 Tệp TIMDS.OUT 2 [1 3].

<span class='text_page_counter'>(7)</span> 1 3 2 4 1 3 4 4 3. [3] [2 1 3] [3 2] [1 3 2 4] [2] [2 4 3] [4 2 3 1] [1 5 3 4] [2 4 1]. MÃ NGUỒN BÀI 1 (Tệp BS1H0.PAS). {Phan khai bao chung} uses crt; Const tentep = 'BS1H0'; {Ten tep} ktm = 30000; Type MBytes = array[1..ktm] of byte; Var N: longint; M, TG: MBytes; slm, slt: longint;. {Dau vao} {Dau ra} {Dau ra}. ln: longint; pa, sopa: byte; f: text;. {Bien phu} {QL phuong an} {Bien tep}. {Dem so phuong an} procedure DemSoPA; BEGIN assign(f,tentep+'.INP'); reset(f); sopa:=0; while (not eof(f)) do begin readln(f);.

<span class='text_page_counter'>(8)</span> inc(sopa); end; close(f); END; {Doc du lieu cua phuong an pa} procedure DocPA; var i: byte; s: string; BEGIN assign(f,tentep+'.INP'); reset(f); i:=1; while (i<pa) do begin readln(f); inc(i); end; read(f,N); close(f); str(N,s); ln := length(s); END; {Sinh day 0-1 ke tiep voi day M da co} procedure SinhKT(dd: integer; var kt: boolean); var i, j: longint; BEGIN kt := false; i := dd; while M[i] = 1 do begin M[i] := 0; dec(i); end; if i >= 1 then M[i] := 1 else kt := true; END; function BoiSo(dd: longint): boolean; var sd, i: longint; BEGIN fillchar(TG,sizeof(TG),0); BoiSo := false; slt := 0; if dd < ln then exit else begin sd := M[1] mod N; inc(slt); TG[slt] := sd div N; for i := 2 to dd do. begin sd := 10*sd + M[i]; inc(slt); TG[slt] := sd div N; sd := sd mod N; end; BoiSo := (sd = 0); end; END; {Tim day 0-1 la boi so cua N} Procedure TimM; var bs, kt: boolean; i: longint; BEGIN slm := ln; fillchar(M,sizeof(M),0); M[1] := 1; kt := false; repeat while (not kt) do begin bs := BoiSo(slm); if bs then break else SinhKT(slm, kt); end; if (kt) and (not bs) then begin inc(slm); fillchar(M,sizeof(M),0); M[1] := 1; kt := false; end; until bs; END; {Ghi ket qua ra man hinh va tep tin} procedure GhiKQ; var i, id: longint; BEGIN assign(f,tentep+'.OUT'); if pa = 1 then rewrite(f) else append(f); write(slm,' '); write(f,slm,' '); for i := 1 to slm do begin write(M[i]); write(f,M[i]); end; id := 1; while TG[id] = 0 do inc(id);.

<span class='text_page_counter'>(9)</span> write(' ',slt-id+1,' '); write(f,' ',slt-id+1,' '); for i := id to slt do begin write(TG[i]); write(f,TG[i]); end; writeln; writeln(f); close(f); END;. BEGIN clrscr; DemSoPA; for pa:=1 to sopa do begin DocPA; TimM; GhiKQ; end; writeln; write('Da xong. Nhan ENTER de thoat'); Readln; END.. {Chuong trinh chinh}. GIẢI THÍCH MÃ NGUỒN BÀI 1 1. Chương trình chính. Sau khi gọi lệnh DemSoPA, vòng lặp For gọi các lệnh DocPA, TimM, và GhiKQ. 2. Lệnh DemSoPA: đếm số phương án có trong tệp dữ liệu. 3. Lệnh DocPA: đọc dữ liệu của phương án thứ pa. 4. Lệnh GhiKQ: ghi kết quả ra màn hình và tệp tin. 5. Lệnh TimM: Tìm số M theo yêu cầu, thuật giải đã nêu ở phần Gợi ý cách giải.. MÃ NGUỒN BÀI 2 (Tệp TAODT.PAS) uses crt; Const tentep = 'TAODT'; Nmax = 30;. NK, ND: byte;. {Ten tep}. Type MBytes = array[0..Nmax] of byte; Var. {Dau vao}.

<span class='text_page_counter'>(10)</span>

<span class='text_page_counter'>(11)</span>

<span class='text_page_counter'>(12)</span>

<span class='text_page_counter'>(13)</span>

<span class='text_page_counter'>(14)</span>

<span class='text_page_counter'>(15)</span>

<span class='text_page_counter'>(16)</span>

<span class='text_page_counter'>(17)</span>

<span class='text_page_counter'>(18)</span>

<span class='text_page_counter'>(19)</span>

<span class='text_page_counter'>(20)</span>

<span class='text_page_counter'>(21)</span>

<span class='text_page_counter'>(22)</span>

<span class='text_page_counter'>(23)</span> while not eoln(f) do begin inc(spt); read(f,DV[spt]); end; close(f); END; {Sinh day tang ke sau day da co} procedure SinhKT(N: byte; var sl: byte; var mm: MBytes); BEGIN if (mm[sl] < N) then begin inc(sl); mm[sl] := mm[sl-1] + 1 end else if (mm[sl] >= N) then begin dec(sl); inc(mm[sl]); end; END; {Tim day tang o vi tri thu TTK} Procedure TimDT; var tt: longint; BEGIN fillchar(DK,sizeof(DK),0); DK[1] := 1; slr := 1; tt := 1; while tt < TK do begin SinhKT(NK, slr, DK); inc(tt); end; END; {Kiem tra 2 mang m1, m2 co bang nhau khong} function BangNhau(m1, m2: MBytes; sl1, sl2: byte): boolean; var i: byte; kq: boolean; BEGIN kq := true; if sl1 <> sl2 then kq := false else for i := 1 to sl1 do if m1[i] <> m2[i] then begin kq := false;.

<span class='text_page_counter'>(24)</span> break; end; BangNhau := kq; END; {Tim thu tu TTD cua day tang DV} Procedure TimTD; var a: MBytes; sla: byte; BEGIN fillchar(a,sizeof(a),0); a[1] := 1; sla := 1; TD := 1; while not BangNhau(a, DV, sla, spt) do begin SinhKT(ND, sla, a); inc(TD); end; END; {Ghi ket qua ra man hinh va tep tin} procedure GhiKQ; var i, id, j: integer; BEGIN assign(f,tentep+'.OUT'); if pa=1 then rewrite(f) else append(f);. write(slr,' [',DK[1]); write(f,slr,' [',DK[1]); for i := 2 to slr do begin write(' ',DK[i]); write(f,' ',DK[i]); end; writeln('] ',spt,' ',TD); writeln(f,'] ',spt,' ',TD); close(f); END; {Chuong trinh chinh} BEGIN clrscr; DemSoPA; for pa:=1 to sopa do begin DocPA; TimDT; TimTD; GhiKQ; end; writeln; write('Da xong. Nhan ENTER de thoat'); Readln; END.. GIẢI THÍCH MÃ NGUỒN BÀI 2 1. Chương trình chính. Sau khi gọi lệnh DemSoPA, vòng lặp For gọi các lệnh DocPA, TimDT, TimTD, và GhiKQ. 2. Lệnh DemSoPA: đếm số phương án có trong tệp dữ liệu. 3. Lệnh DocPA: đọc dữ liệu của phương án thứ pa. 4. Lệnh GhiKQ: ghi kết quả ra màn hình và tệp tin. 5. Lệnh TimDT: Tìm dãy tăng có thứ tự là TT đã cho, thuật giải đã nêu ở phần Gợi ý cách giải. 6. Lệnh TimTD: Tìm thứ tự của dãy tăng DV đã cho, thuật giải đã nêu ở phần Gợi ý cách giải..

<span class='text_page_counter'>(25)</span> MÃ NGUỒN BÀI 3 (Tệp TIMDS.PAS) uses crt; Const tentep = 'TIMDS'; Nmax = 9;. {Ten tep}. Type MBytes = array[1..Nmax] of byte; Var N, M: byte; T: longint; sl: byte; D: MBytes; pa, sopa: byte; f: text;. {Dau vao} {Dau vao} {Dau ra} {Dau ra} {QL phuong an} {Bien tep}. {Dem so phuong an} procedure DemSoPA;.

<span class='text_page_counter'>(26)</span>

<span class='text_page_counter'>(27)</span>

<span class='text_page_counter'>(28)</span>

<span class='text_page_counter'>(29)</span>

<span class='text_page_counter'>(30)</span>

<span class='text_page_counter'>(31)</span>

<span class='text_page_counter'>(32)</span> DaCo := false; for i:= 1 to ii do if mm[i] = kk then begin DaCo := true; Exit; end; END; {Tim gia tri dau tien chua dung trong day mm} function GTMoi(sl: byte; mm: MBytes): byte; var i, gtm: byte; BEGIN gtm := 0; for i := 1 to M do if not DaCo(sl,i, mm) then begin gtm := i; break; end; GTMoi := gtm; END; {Sinh day tang ke sau day da co} procedure SinhDS(N, M: byte; var sl: byte; var mm: MBytes); var i, j, gtm: byte; BEGIN gtm := GTMoi(sl,mm); if (sl < N) then begin mm[sl+1] := gtm; inc(sl); end else {sl = N: da dung het cac gia tri} begin if (mm[sl]<gtm) then mm[sl] := gtm else begin for i := sl downto 2 do if mm[i] > mm[i-1] then break;{tim i lon nhat thoa man mm[i] < mm[i+1]} dec(i); inc(mm[i]); while DaCo(i-1, mm[i], mm) do inc(mm[i]); sl := i; end; end; END; {Tim day so o vi tri thu T} Procedure TimD; var tt,i: longint; BEGIN.

<span class='text_page_counter'>(33)</span> fillchar(D,sizeof(D),0); D[1] := 1; sl := 1; tt := 1; while tt < T do begin SinhDS(N, M, sl, D); inc(tt); end; END; {Ghi ket qua ra man hinh va tep tin} procedure GhiKQ; var i, id, j: integer; BEGIN assign(f,tentep+'.OUT'); if pa=1 then rewrite(f) else append(f); write(sl,' [',D[1]); write(f,sl,' [',D[1]); for i := 2 to sl do begin write(' ',D[i]);. write(f,' ',D[i]); end; writeln(']'); writeln(f,']'); close(f); END; {Chuong trinh chinh} BEGIN clrscr; DemSoPA; for pa:=1 to sopa do begin DocPA; TimD; GhiKQ; end; writeln; write('Da xong. Nhan ENTER de thoat'); Readln; END.. GIẢI THÍCH MÃ NGUỒN BÀI 3 1. Chương trình chính. Sau khi gọi lệnh DemSoPA, vòng lặp For gọi các lệnh DocPA, TimD, và GhiKQ. 2. Lệnh DemSoPA: đếm số phương án có trong tệp dữ liệu. 3. Lệnh DocPA: đọc dữ liệu của phương án thứ pa. 4. Lệnh GhiKQ: ghi kết quả ra màn hình và tệp tin. 5. Lệnh TimD: Tìm dãy số theo yêu cầu, thuật giải đã nêu ở phần Gợi ý cách giải..

<span class='text_page_counter'>(34)</span>

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×