ViÖc lµm nµy nh»m môc ®Ých t¹o mét th môc chøa file bµi lµm cña häc sinh ®Ó häc sinh tr¸nh viÖc chÐp nhÇm file bµi lµm.. - T¹o trong th môc THI mét file TP.BAT, cã néi dung lµ ®êng dÉn[r]
(1)giíi thiƯu
Từ năm học 2006-2007, Bộ Giáo dục Đào tạo định đa Tin học thành môn học trờng phổ thông Đây định đắn kịp thời
Hiện nay, có nhiều tài liệu Tin học để giáo viên học sinh triển khai hoạt động dạy học nhng thiếu số tài liệu tham khảo khác nh: sách tập, tài liệu nâng cao phục vụ công tác bồi dỡng học sinh giỏi
Từ kinh nghiệm giảng dạy môn, đồng thời thấy đợc nhu cầu thực tiễn, mạnh dạn biên soạn tài liệu nhằm giúp giáo viên học sinh triển khai tốt hoạt động dạy học môn Tin học, đặc biệt công tác bồi dỡng học sinh gii
Nội dung tài liệu gồm có phần
Phần 1: Một số kinh nghiệm, nhằm trình bày số kinh nghiệm việc hớng dẫn học sinh làm bài, nộp chiến lợc đạt điểm cao
Phần 2: Một số chuyên đề, nhằm trình bày số vấn đề việc bồi dỡng học sinh giỏi nh: Phơng pháp đánh dấu phần tử; Số ngun tố, thuật tốn hình học phẳng, thuật toán đệ quy quay lui, thuật toán quy hoạch động
Phần 3: Một số tập đề nghị Phần giới thiệu số tập đơn giản nhằm giúp ngời đọc tự rèn luyện chọn làm tập cho học sinh giảng dạy kiến thức
Phần 4: Một số tập tuyển chọn Phần giới thiệu số tập tơng đối khó, đợc chọn làm đề thi học sinh giỏi qua năm Sau đề tập chúng tơi tích hợp chơng trình gợi ý nhằm giúp bạn đọc có điều kiện tham khảo Các tập có thuật tốn điển hình thờng đợc sử dụng kỳ thi học sinh giỏi năm
Với thời gian có hạn, chắn tài liệu khơng tránh khỏi thiếu sót Chúng tơi biết ơn đóng góp ý kiến q báu từ phía bạn đọc để tài liệu ngày hoàn thiện hn
Đồng Hới, ngày 20 tháng 11 năm 2009
Lê Thủy Thạch
Mt s kinh nghiệm việc hớng dẫn học sinh làm bài, nộp chiến lợc đạt điểm cao có thể.
I - Hớng dẫn học sinh trình bày nộp thi
1 - Tạo th mục chứa bµi thi
- Khởi động NC
(2)Việc làm nhằm mục đích tạo th mục chứa file làm học sinh để học sinh tránh việc chép nhầm file làm
- Tạo th mục THI file TP.BAT, có nội dung đờng dẫn đến TURBO.EXE Thông thờng C:\TP\BIN\TURBO.EXE
Việc làm nhằm mục đích thuận tiện khởi động Turbo Pascal Để khởi động Turbo, cần đa trỏ đến TP.bat Enter
Khi thực tạo file chơng trình Pascal, file nằm th mục THI đợc tạo
2 - Trình bày thi thao tác lập trình
a- Cần phải tách riêng thao tác tạo kiểu liệu khai báo biến: Nhiều giáo viên thờng hớng dẫn học sinh khai báo biến mảng nh sau:
Var a:array[1 10] of integer;
C¸ch không tiện, thông thờng lập trình giải toán, ta thờng sử dụng chơng trình truyền tham số
Khi ú ta có khai báo : tên chơng trình con(tên biến: tên kiểu liệu); Nếu biến mảng, ta vit :
tên chơng trình (a :array[1 10] of integer) ;
b-Nếu liệuvào đợc cho file, phải đặt tên file phần const: Ví dụ: Const fi= ‘BAI1.INP’;
Giám khảo có nhiều file liệu vào với tên file có dạng: XXX.IN?, dấu ? số thuộc
Khi chấm bài, giám khảo việc thay ký tự cuối cúng tên file thực chơng trình để thu kết
Nếu thí sinh để tên file thân chơng trình, chẳng hạn: assign(f,‘bai1.inp’), điều buộc giám khảo phải tìm tên file chơng trình học sinh Việc làm có hai điều bất lợi:
Thứ nhất: gây ức chế cho giám khảo phải di chuyển trỏ nhiều lần để thay đổi tên file liệu vào
Thø hai: Cã thể trình di chuyển trỏ, giám khảo bấm nhầm phím làm hỏng file chơng trình thÝ sinh
c-Nếu đề yêu cầu xuất liệu file, kết thúc chơng trình khơng đợc đặt readln;
Nếu thí sinh cố tình đặt readln để dừng hình, giám khảo cho chơng trình thực cha xong khơng cho điểm Giám khảo khơng bấm Enter mà bấm CTRL+Break, xem nh chơng trình bị ngắt chừng, kết khơng đợc ghi file
d-Đầu chơng trình bắt buộc phải có dẫn biên dịch {$R+}
ý nghĩa {$R+} là: Kiểm tra tràn phạm vi biến: Range check
Nu có tích hợp {$R+}, Turbo Pascal tự động kiểm tra tràn phạm vi, nhiên thời gian thực chơng trình lớn Nếu khơng đặt Turbo Pascal khụng kim tra
Chẳng hạn, ta có khai báo: a: array [1 10] of integer; có lệnh: For i:=1 to 11 a[i]:=i;
Nếu khơng tích hợp {$R+} ta khơng thể phát đợc lỗi tràn phạm vi biến mảng a
e-Cần lu file từ đầu, sau lu tiếp trình làm Mục đích tránh chơng trình điện chừng f-Đặt tên file làm tên file liệu vào với yêu cầu đề bài
(3)g-Làm biên dịch đó.
Mục đích nhằm dễ dàng phát lỗi tả chơng trình Nếu xuất lỗi lỗi lệnh vừa gõ sinh
3 - Sao chÐp bµi vµ nép bµi
a-Mở khóa đĩa mềm Đặt đĩa vào ổ đĩa Chép file th mục tạo vào đĩa mềm.
Cần cẩn thận thao tác chép, tồn file có phần tên giống nhng khác phần mở rộng: PAS BAK File PAS file chơng trình cần chép, File BAK file backup, file cũ sau lần ta sửa đổi lu lại sửa đổi b-Khóa đĩa trớc nộp đĩa cho giám thị.
Khi đĩa đợc khóa, ta khơng thể lu thông tin lên đĩa
Việc làm tránh đợc tình bị giám thị làm hỏng file chng trỡnh
c-Chờ giám thị in kiểm tra thi giấy.
Sau np bài, giám thị phải thực in thi giấy để làm chứng phòng tránh trờng hợp hỏng đĩa
Thí sinh cần phải dị lại Điều giúp thí sinh tránh đợc tình giám thị in học sinh khác cho Nếu in làm đĩa khác nhau, xem nh làm học sinh không hợp lệ, thí sinh chắn bị hủy kết thi
d-Ký xác nhận nhờ học sinh kh¸c ký x¸c nhËn
Mục đích ký xác nhận nhằm khẳng định tờ giấy in làm tránh xảy tiêu cực thí sinh dự thi giám thị đổi
4 - Các bớc để hoàn thành chơng trình
Phơng pháp tổng quát để giải tốn tin học hệ thống bớc có tính ổn định nhằm giúp ngời học tìm thuật giải, biễu diễn đợc liệu từ viết đợc chơng trình
Phơng pháp tổng qt để giải toán tin học bao gồm bớc sau:
a- Xác định toán
Mọi tốn Tin học diễn đạt theo sơ đồ chung A B
A: gọi INPUT (thông tin vào) B: gọi OUTPUT (th«ng tin ra)
: gọi chơng trình đợc tạo từ câu lệnh máy cho phép biến A thành B
Ví dụ: Cho hai số tự nhiên a,b Tìm USCLN chúng Xác định thông tin vào: Hai số tự nhiên a, b
Xác định thông tin ra: Số tự nhiên d thoả mãn d ớc a d ớc b d lớn tập ớc chung
Xác định thao tác chế biến thông tin:
Xây dựng tập hữu hạn phép tính cho phép tính đợc d t a v b
b-Tìm cấu trúc liệu biễu diễn toán
Vic la chon CTDL tu thuộc vào vấn đề phải giải Sau chọn cách biểu diễn thông tin Việc tuỳ thuộc vào thao tác thực kiểu liệu
Các lu ý chọn cấu trúc liệu
+CTDL phải biểu diễn đợc đầy đủ thơng tin nhập xuất tốn +CTDL phải phù hợp với thao tác thuật toán mà ta lựa chọn để giải toán
(4)c-Tìm thuật toán
Thut toỏn l mt hệ thống chặt chẽ rõ ràng quy tắc nhằm xác định dãy thao tác dãy đối tợng cho sau hữu hạn bớc thực thao tác, ta đạt đợc mục tiêu định trớc
d- LËp tr×nh
Lập trình dùng ngơn ngữ cụ thể để diễn tả thuật toán, cấu trúc liệu thành câu lệnh để máy tính thực đợc giải toán mà ngời lập trình mong muốn
Phát triển chơng trình cách tinh chế bớc: Tinh chế bớc phơng pháp khoa học có hệ thống giúp ta phân tích thuật tốn, cấu trúc liệu từ viết thành chơng trình
e-Chạy thử, thay đổi kiểm tra chơng trình
Chạy thử: Một chơng trình viết cha chạy đợc máy kết mong muốn địi hỏi phải chạy thử chơng trình Kỹ tìm lỗi, sửa lỗi, điều chỉnh kỹ ngời lập trình
Lu ý xây dựng test
Nên khởi đầu test nhỏ nhng chứa giá trị đặc biệt Làm nhiều test nhng a dng
Phải có test có kích thớc lớn
Ví dụ: Khi viết chơng trình giải phơng trình ax2 + bx + c = ta phải xây dựng
các test nh sau:
a b c
0 0
0
1
2
Ngồi ra, cần xây dựng test có giá trị lớn nh: 32767 32766 Lu ý: Chơng trình chạy qua số test cha chơng trình
f/ Thay đổi chơng trình
Một chơng trình viết xong, chạy tốt cha trình lập trình kết thúc Ta phải sửa đổi theo hớng để đáp ứng yêu cầu Ph-ơng pháp tinh chế bớc giúp ta thuận lợi việc sửa đổi chPh-ơng trình II - Chiến lợc đoạt điểm
-Phải tham gia giải hết tất đề kết chơng trình khơng Điều nhằm đoạt đợc điểm tránh đợc điểm Cần ý phải biên dịch thành công
-Tìm trờng hợp dễ để xuất kết
-Đối với tốn có trả lời YES/NO (hoặc 1/0), giải khơng đợc nên xuất giá trị YES (hoặc 1), gở đợc 1/3 số điểm câu (mẹo tính hiệu không cao, đặc biệt kỳ thi HSG Quốc gia)
B - Một số chuyên đề
I - Đánh dấu phần tử đợc chọn
1-ý tëngchung
Kỹ thuật đánh dấu phần tử kỹ thuật nhằm giúp cho ng-ời lập trình tạo đợc thuật tốn đơn giản để giải vấn đề đặt
Để đánh dấu phần tử đợc chọn, ta khai báo mảng A gồm nhiều phần tử, với A[i]=true theo nghĩa i phần tử đợc chọn, A[i]=false theo nghĩa i phần tử không đợc chọn
2-ứng dụng PP đánh dấu toán xếp dãy số
(5)Bài toán: Cho dÃy số gồm N phần tử (1<=N<=32766) Các phần tử
ca dóy l cỏc số nguyên dơng, đôi khác (1<=ai <=32766) Hãy sp
xếp dÃy số tăng dần
Ta thng sử dụng thuật giải xếp đơn giản để giải toán nh sau:
For i:=1 to N-1 For j:=i+1 to N
If a[i]<a[j] then Begin t:=a[i]; a[i]:=a[j] a[j]:=t; End;
Chơng trình biểu diƠn cđa tht to¸n:
const fi='sap1.inp'; fo='sap1.out';
type mmc=array[1 32766] of integer; var f:text;
i,j,n,t:integer;
a:^mmc; ti:longint; begin
ti:=meml[0:$46c]; new(a);
assign(f,fi);reset(f); readln(f,n);
for i:=1 to n read(f,a^[i]); close(f);
for i:=1 to n-1 do for j:=i+1 to n do
if a^[i]>a^[j] then begin
t:=a^[i]; a^[i]:=a^[j]; a^[j]:=t; end;
assign(f,fo);rewrite(f); writeln(f,n);
for i:=1 to n write(f,a^[i],' '); close(f);
dispose(a);
writeln('Thoi gian thu hien ',(meml[0:$46c]-ti)/18.21:8:5); readln;
end.
Khi N bé, thuật toán chấp nhận đợc Tuy nhiên, nhiều trờng hợp N lớn, chẳng hạn N=32766 phần tử, độ phức tạp thuật toán O(N2) máy thực nhiều thời gian xếp đợc dãy số (với
N=20000, thêi gian thùc hiÖn khoảng 14 giây)
gii quyt c bi toỏn N lớn khoảng thời gian nhỏ, ta sử dụng kỹ thuật đánh dấu phần tử
(6)nhau Đối với toán xếp có phần tử trùng ta sử dụng ph-ơng pháp
Phơng pháp: Dữ liệu:
Sử dụng mảng A gồm 32766 phần tử, phần tử có kiểu boolean ý nghĩa:
A[i]=true có nghĩa i phần tử có dÃy, A[i]=false có nghĩa i phần tử d·y
ThuËt to¸n:
+ Khởi động giá trị A[] False {Giống nh giả sử ban đầu phần tử không thuộc dãy số}
+ Đọc phần tử dãy số, giả sử số thứ j dãy X, ta đánh dấu phần tử A[X]=true {Xác nhận số X thuộc dãy số} Thực đánh dấu đọc hết dãy số Khi ta thu đợc mảng A[] A[i]=true số i có giá trị giá trị phần tử dãy số
+ Duyệt từ đầu mảng đến cuối mảng, vị trí vào có giá trị True ta xuất số Kết ta đợc dãy số c sp xp tng dn
Chơng trình mẫu:
const fi='sap1.inp'; fo='sap2.out';
type mmcb=array[1 32766] of boolean; var f:text;
n:word; b:mmcb; ti:longint; procedure doc; var i,x:word; begin
fillchar(b,sizeof(b),false); assign(f,fi);
reset(f); readln(f,n); for i:=1 to n do begin
read(f,x); b[x]:=true; end;
close(f); assign(f,fo); rewrite(f); writeln(f,n);
for i:=1 to 32766 do
if b[i]=true then write(f,i,' '); end;
begin
ti:=meml[0:$46c]; doc;
writeln('TG=',(meml[0:$46c]-ti)/18.21:8:4); readln;
(7)NhËn xÐt:
Khi N=20000 chơng trình thực 0.05giây Chơng trình chạy nhanh gấp 280 lần so với chơng trình viết theo thuật toán đơn giản
Rõ ràng, kỹ thuật đánh dấu phần tử có ý nghĩa quan trọng việc giảm thời gian thực chơng trình
3 - ứng dụng PP đánh dấu toán lọc liệu
Lọc liệu vấn đề có ý nghĩa to lớn xử lý thông tin ý nghĩa thực tiễn lọc liệu nhằm loại bỏ liệu d thừa, khơng cần thiết, từ dễ dàng thu đợc thơng tin cần tìm
Bài tốn: Cho dãy số gồm N phần tử (1<=N<=32766), phần tử có kiểu ngun nằm [1 32766] Hãy trích từ dãy số tập gồm nhiều phần tử cho phần tử đôi khác
Ta thờng giải toán theo thuật toán đơn giản nh sau: + Dùng mảng B[] để lu giá trị tìm đợc
+ Đọc phần tử dãy số cho, giả sử số đọc đợc X Kiểm tra xem X có B[] hay cha
+ Nếu cha có B[] đặt vào cuối B[]
Khi N bé, thuật tốn chấp nhận đợc Tuy nhiên, nhiều tr-ờng hợp N lớn, chẳng hạn N=32766 phần tử, độ phức tạp thuật toán O(N2) máy thực nhiều thời gian để lấy phần tử
trong dãy để so sánh với phần tử tập B[]
Để giải đợc toán N lớn khoảng thời gian nhỏ, ta sử dụng kỹ thuật đánh dấu phn t
Phơng pháp: Dữ liệu:
Sử dụng mảng B gồm 32766 phần tử, phần tư cã kiĨu boolean ý nghÜa:
B[i]=true cã nghĩa i phần tử ta chọn, B[i]=false có nghĩa i phần tử ta không chọn
Thuật to¸n:
+ Khởi động giá trị B[] False {Giống nh giả sử ban đầu ta cha chọn phần tử cả}
+ Đọc phần tử dãy số, giả sử số thứ j dãy X, ta đánh dấu phần tử B[X]=true {Xác nhận số X đợc chọn} Thực đánh dấu đọc hết dãy số Khi ta thu đợc mảng B[] B[i]=true số i mà i xuất lần dãy cho
+ Duyệt từ đầu mảng đến cuối mảng B[], vị trí có giá trị True ta xuất số Kết ta đợc tập phần tử cần tìm
Chơng trình mẫu:
const fi='tc.in1'; fo='tc.ou4'; nn=60000; var n,a:word;
f:text;
k:array[1 nn] of boolean; procedure doctep;
var i:word; begin
assign(f,fi); reset(f);
(8)for i:=1 to n do begin
read(f,a); k[a]:=true; end;
close(f); end;
procedure xulivaxuat; var i,d:word;
begin
assign(f,fo); rewrite(f);
d:=0;
for i:=1 to nn do
if k[i]=true then d:=d+1; writeln(f,d);
for i:=1 to nn do
if k[i]=true then write(f,' ',i); close(f);
end; BEGIN doctep; xulivaxuat; END.
Nhận xét: Chơng trình chạy nhanh gấp khoảng 300 lần so với chơng trình viết theo thuật toán đơn giản
4-ứng dụng PP đánh dấu tốn tìm giao hai tập hợp
Xác định giao hai tập hợp toán quan trọng toán học Trong thực tiễn, phép giao nhằm giúp ta xác định đợc nhóm thơng tin chung nhiều nhóm thơng tin
Bài toán:
Cho bn TEP1.INP TEP2.INP chứa N số tự nhiên khoảng M trùng Hãy tạo TEP3.OUT chứa số có mặt hai tệp TEP1.INP TEP2.INP cho số đôi khác
DLV DLR
Dßng 1: Sè N (1<=N<=32766) Dßng 2: N sè (1<=ai<=M<=32766)
Dịng chứa số tìm đợc Ví dụ
TEP1.INP TEP2.INP TEP3.OUT
5 7
3 19
1
Ta thờng giải toán theo thuật toán đơn giản nh sau: + Dùng mảng A[] để lu số tệp
+ Dùng mảng B[] để lu số tệp
+ LÊy phần tử Xi A[], so sánh với lần lợt phần tử Yj
B[] Nu Xi có B[] đem Xi đặt vào mảng C[]
+ LÊy tõng phÇn tư Yj B[], so sánh với lần lợt phần tử Zk
C[] Nếu Yj có C[] đem Yj đặt vào mảng D[]
(9)Khi N bé, thuật tốn chấp nhận đợc Tuy nhiên, nhiều tr-ờng hợp N lớn, chẳng hạn N=32766 phần tử, độ phức tạp thuật toán O(2N2) máy thực nhiều thời gian để lấy phần tử
trong A[] để so sánh với phần tử B[]
Để giải đợc toán N lớn khoảng thời gian nhỏ, ta sử dụng kỹ thuật đánh dấu phần tử nh sau:
Ph¬ng pháp: Dữ liệu:
Sử dụng hai mảng A B gồm 32766 phần tử, phần tử có kiÓu boolean
ý nghÜa:
A[i]=true cã nghÜa i phần tử thuộc tệp 1, A[i]=false có nghĩa i phần tử không thuộc tệp
B[i]=true có nghĩa i phần tử thuộc tệp 2, B[i]=false có nghĩa i phần tử không thuộc tệp
ThuËt to¸n:
+ Khởi động giá trị A[] B[] False
+ Đọc phần tử tệp 1, giả sử số đọc đợc dãy X, ta đánh dấu phần tử A[X]=true {Xác nhận số X thuộc tệp 1} Thực đọc đánh dấu đọc hết tệp
Khi ta thu đợc mảng A[] A[i]=true số i mà i xuất lần tệp
+ Đọc phần tử tệp 2, giả sử số đọc đợc dãy Y, ta đánh dấu phần tử B[Y]=true {Xác nhận số Y thuộc tệp 2} Thực đọc đánh dấu đọc hết tệp
Khi ta thu đợc mảng B[] B[i]=true số i mà i xuất lần tệp
+ Duyệt từ đầu mảng đến cuối mảng A[] B[], vị trí mà A[i] B[i] có giá trị True ta xuất số Kết ta đợc tập phần tử cn tỡm
Chơng trình mẫu:
const f1='tep1.inp'; f2='tep2.inp'; f3='tep3.out';
type mmc=array[1 32767] of boolean; var n,i,j,a:longint;
k:mmc; f,fi:text; procedure doctep; begin
assign(f,f1); reset(f);
readln(f,n); for i:=1 to n do begin
read(f,a); k[a]:=true; end;
(10)procedure xulivaxuat; begin
assign(fi,f3); rewrite(fi); assign(f,f2); reset(f); readln(f,n); for i:=1 to n do begin
read(f,a);
if k[a]=true then begin
write(fi,' ',a); k[a]:=false; end;
end; close(f); close(fi); end;
BEGIN doctep; xulivaxuat; end.
Nhận xét: Chơng trình chạy nhanh gấp 400 lần so với chơng trình viết theo thuật tốn đơn giản
II - Sè nguyªn tố
1-Khái niệm số nguyên tố
đơn giản dễ nhớ, ta hiểu: Số nguyên tố số tự nhiên lớn có hai ớc số
Chẳng hạn: Số số nguyên tố Số số nguyên tố
2-Mt s tốn liên quan đến số ngun tố
Bµi 1: Viết chơng trình nhập số nguyên dơng X (2<=X<=2147483647) HÃy kiểm tra xem X có phải số nguyên tố hay không?
Phng phỏp: Duyt cỏc s i từ đến X-1 Nếu tồn số i mà X chia hết cho i kết luận đợc X khơng phải số ngun tố
Tht to¸n:
+NhËp sè X; +Phai:=true;
+For i:=2 to X-1
If X mod i = then phai=false;
+If phai=true then xuat(X la so nguyen to) Ngợc lại xuat(X khong phai la so nguyen to ); Chơng trình:
var x,i:longint; phai:boolean; begin
writeln('Hay nhap vao mot so nguyen > '); readln(X);
phai:=true;
(11)if x mod i=0 then phai:=false;
if phai=false then writeln(X,' Khong phai la so NT ') else writeln(X,' La so nguyen to ');
readln; end.
NhËn xÐt:
-Chơng trình đợc viết theo thuật toán thực chậm X lớn -Để cải tiến chơng trình ta có số nhận xét sau:
+ Với X ta có: X khơng chia hết cho số số từ (X div 2)+1 đến X-1
+ Khi tån t¹i mét sè i thuéc [2 X div 2] mà X chia hết cho i chắn X số nguyên tố
-Trờn c s hai nhận xét ta đề xuất:
+ ChØ lặp lại thực kiểm tra số i thuộc [2 X div 2]
+ NÕu tån t¹i sè i thuéc [2 X div 2] mµ X chia hÕt cho i dừng lặp
Thuật toán cải tiến
Bíc 1: NhËp: X
Bíc 2: Khëi t¹o: Phai:=true; i:=2; Bớc 3: Lặp: (i<= X div 2) (phai =true)
If X mod i = then phai=false; Qua bíc 4; If X mod i <> then i:=i+1; Quay lại Bớc 3: Bớc 4: Trả lời: If phai=true then xuat(‘X la so nguyen to’)
Ngỵc lại xuat(X khong phai la so nguyen to ); Chơng trình cải tiến
var x,i:longint; phai:boolean; begin
writeln('Hay nhap vao mot so nguyen > '); readln(X);
phai:=true; i:=2;
while (i<=x div 2) and (phai=true) do begin
if x mod i=0 then begin
phai:=false;
writeln('uoc so=',i); end;
i:=i+1; end;
if phai=false then writeln(X,' Khong phai la so nguyen to ') else writeln(X,' La so nguyen to ');
readln; end.
Bài 2: Viết chơng trình đếm tất số nguyên tố từ N (2<=N<=32766) Phơng pháp:
(12)Tht to¸n
Bíc 1: NhËp: N
Bớc 2: Lặp: với x [2 N] ta thực bớc sau: Bớc 3: Khởi tạo: Phai:=true; i:=2;
Bíc 4: LỈp: (i<= X div 2) vµ (phai =true)
If X mod i = then phai=false;
If X mod i <> then i:=i+1; Quay lại Bớc 4: Bớc 5: Đếm: If phai=true then dem:=dem+1;
Quay lại bớc 3; Bớc 6: Trả lời: xuat(dem) Chơng trình:
var n,x,i,dem:integer; phai:boolean;
begin
writeln('Hay nhap vao mot so nguyen N > '); readln(N);
dem:=0;
For x:=2 to n do Begin
phai:=true; i:=2;
while (i<=x div 2) and (phai=true) do begin
if x mod i=0 then phai:=false; i:=i+1;
end;
if phai=true then dem:=dem+1; end;
writeln('Co ',dem, ' so nguyen to '); readln;
end.
NhËn xÐt:
-Với số X ta phải lặp X div lÇn phÐp kiĨm tra VËy cã N sè X, ta phải lặp lại N*(X div 2) lần Độ phức tạp cđa tht to¸n xÊp xØ O(N2).
-Trong lập trình giải tốn, ngời ta đề tìm số nguyên tố mà thờng là: việc xác định số nguyên tố toán phụ cho tốn khác Chính việc xác định số nguyên tố phải sử dụng thời gian thc hin nht cú th
-Để cải tiến thuật to¸n, ta cã nhËn xÐt quan träng: Víi bÊt kú số nguyên X (X>1), ta có bội số X (khác X) số nguyên tố
Phơng pháp cải tiến:
-Gi s ta ó xỏc định đợc X số nguyên tố, ta đánh dấu False cho tất số bội X Sau xét đến số đợc đánh dấu False, ta không cần kiểm tra số
-Để thực đợc ta sử dụng mảng gồm 32767 phần tử có kiểu Boolean
Thuật toán cải tiến:
Bớc 1: Nhập: N
Bớc 2: Khởi tạo: Mảng B[] True
(13)Nếu B[X] = True
Đánh dấu tất bội X thành False (B[K*X]:=False; Quay lại Bớc 3:
Bớc 4: Đếm:
dem:=0;
Duyệt từ đầu đến cuối mảng B[] If B[X]=true then dem:=dem+1; Bc 5: Tr li: xuat(dem);
Chơng trình c¶i tiÕn:
const nn=32766;
fo='daynt.out';
type mmb=array[1 nn] of boolean;
var f:text; n,dem:integer; b:mmb; t:longint; procedure lapmangnt;
var i,j:longint; begin
write('Nhap mot so nguyen N>2 '); readln(n);
t:=meml[0:$46c];
for i:=1 to n b[i]:=true; for i:=2 to n do
if b[i]=true then
for j:=2 to n div i do b[i*j]:=false; assign(f,fo);
rewrite(f); dem:=0;
for i:=2 to n do
if b[i] then dem:=dem+1; writeln(f,dem);
close(f); end;
begin
lapmangnt;
writeln('Thoi gian =',(meml[0:$46c]-t)/18.21:8:4); readln;
end.
NhËn xét: -Thuật toán chơng trình nh phức tạp khó hiểu chơng trình cha cải tiến Tuy nhiên chơng trình thực nhanh xấp xỉ 100 lần so với cha cải tiến
Bài 3: Viết chơng trình in tệp NT.OUT tất số nguyên tố từ N (2<=N<=32766) CÊu tróc cđa NT.OUT nh sau:
Dịng1: Ghi số M số lợng số nguyên tố tìm đợc
Dịng 2: Ghi M số ngun tố tìm đợc số ghi cách dấu cách
Nhận xét: Thực ra, phát triển nhỏ giải Chỉ khác chỗ liệu xuất không số lợng mà bao gồm số nguyên tố Hơn liệu đợc xuất file thay xuất mn hỡnh
Phơng pháp:
(14)Bíc 5: Tr¶ lêi:
xuat(dem)
Duyệt từ đầu đến cuối mảng B[] If B[X]=true then xuat(X); Chơng trình
const nn=32766;
fo='daynt.out';
type mmb=array[1 nn] of boolean;
var f:text; n,dem:integer; b:mmb; t:longint; procedure lapmangnt;
var i,j:longint; begin
write('Nhap mot so nguyen N>2 '); readln(n);
t:=meml[0:$46c];
for i:=1 to n b[i]:=true; for i:=2 to n do
if b[i]=true then
for j:=2 to n div i b[i*j]:=false; assign(f,fo);
rewrite(f); dem:=0;
for i:=2 to n do
if b[i] then dem:=dem+1; writeln(f,dem);
for i:=2 to n do
if b[i] then write(f,i,' '); close(f);
end; begin
lapmangnt;
writeln('Thoi gian =',(meml[0:$46c]-t)/18.21:8:4); readln;
end.
III-Số nhị phân
1-Một số khái niệm liên quan số nhị phân
a-Hệ đếm thập phân:
Dùng 10 ký hiệu 0, 1, 2, 3, 4, 5, 6, 7, 8, để biểu diễn giá trị
Phép cộng thêm đơn vị vào giá trị ta đợc giá trị số đứng tiếp sau Chẳng hạn 2+1=3 Khi thêm đơn vị vào số tận dãy (số 9) ta sử dụng ký hiệu 10 để biểu diễn giá trị thứ mời
b-Hệ đếm nhị phân
Dùng ký hiệu 0, để biểu diễn giá trị
Phép cộng thêm đơn vị vào giá trị ta đợc giá trị số đứng tiếp sau Chẳng hạn 0+1=1 Khi thêm đơn vị vào số tận dãy (số 1) ta sử dụng ký hiệu 10 để biểu diễn giá trị thứ hai
c-Hệ đếm bát phân
(15)Phép cộng thêm đơn vị vào giá trị ta đợc giá trị số đứng tiếp sau Chẳng hạn 2+1=3 Khi thêm đơn vị vào số tận dãy (số 7) ta sử dụng ký hiệu 10 để biểu diễn giá trị thứ tám
c-Hệ đếm Hexa
Dùng 16 ký hiệu 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F để biểu diễn giá trị
Phép cộng thêm đơn vị vào giá trị ta đợc giá trị số đứng tiếp sau Chẳng hạn 9+1=A Khi thêm đơn vị vào số tận dãy (F) ta sử dụng ký hiệu 10 để biểu diễn giá trị thứ mời sáu
d-Chun biĨu diƠn mét gi¸ trị hệ thập phân sang biểu diễn hệ nhị phân
Phng phỏp: Chuyn biu din giỏ tr X hệ thập phân sang hệ nhị phân Lặp lại việc chia số X cho kết
Qua phép chia ta lấy số d phép chia
Viết kết số d theo thứ tự ngợc lại chia ta đợc biểu diễn X hệ nhị phân
VÝ dơ: Chun biĨu diƠn cđa gi¸ trị 29 hệ thập phân sang hệ nhị phân 29 div = 14 d
14 div = d div = d div = d
div = d (dõng)
Vậy, biểu diễn giá trị 29 hệ nhị phân là: 11101
e-Chuyển biểu diễn giá trị hệ thập phân sang biểu diễn hệ nhị phân.
Phơng pháp:
d hiu phng pháp chuyển đổi, ta biểu diễn giá trị cụ thể hệ thập phân nh sau: Chẳng hạn giá trị 308 hệ thập phân đợc viết là: 308 = 3*100 + 0*10 + = 3*102 + 0*101 + 8*100.
Vậy với biểu diễn giá trị 29 hệ nhị phân 11101 đợc viết là: 11101 = 1*24 + 1*23 + 1*22 + 0*21 + 1*20 Tính tổng ta thu đợc giá trị 29.
Chó ý:
Hình thức chuyển đổi biểu diễn giá trị hệ đếm khác hoàn toàn tơng tự nh hai hệ đếm trình bày
Ngoài ra, cách khác, dễ hiểu dễ thực hiện, ta sử dụng hệ đếm thập phân làm trung gian phép chuyển đổi
Chẳng hạn: Để chuyển biểu diễn giá trị hệ bát phân sang hệ nhị phân, ta chuyển biểu diễn giá tri sang hệ thập phân, lấy kết hệ nhị phân chuyển tiếp sang hệ bát phân Minh họa sơ đồ
B¸t phân Thập phân Nhị phân Bát phân Thập phân Nhị phân
2-Một số toán liên quan
Bài 1: Nhập số X hệ thập phân (1<=X<=2148473647) In hình giá trị số h nh phõn
Chơng trình:
var i,a,d:word; du:byte; b:array[1 32000] of byte; procedure xuli;
begin
(16)d:=0;
while a>0 do begin
d:=d+1; du:=a mod 2; b[d]:=du; a:=a div 2; end;
for i:=d downto write(b[i]); end;
begin
xuli;writeln;readln; end.
Bài 2: Nhập số X hệ nhị phân In hình giá trị số h thp phõn
Chơng trình:
var c:string[50]; s1:longint; function mu(x:byte):longint;
begin
if x=0 then mu:=1 else mu:=mu(x-1)*2; end;
procedure xuly;
var x,i:byte;ml:integer; Begin
write('Nhap mot so nhi phan '); readln(c);
for i:=1 to length(c) do begin
val(c[i],x,ml);
s1:=s1+mu(length(c)-i)*x; end;
writeln('Bieu dien thap phan cua ',c,' la ',s1); end;
begin xuly;readln; end.
IV-USCLN, BSCNN
1-Mét số khái niệm liên quan
cho d hiu, ta định nghĩa:
+ Số x đợc gọi ớc số số a a chia hết cho x Khi a đợc gọilà bội số x Nh a ớc số a a bội số a
+ Sè x lµ USC cđa a vµ b nÕu a chia hÕt cho x vµ b chia hÕt cho x
+ Số x đợc gọi USCLN a b x số lớn tất USC a b
+ Sè x lµ BSC cđa a vµ b nÕu x chia hÕt cho a vµ x chia hÕt cho b
+ Số x đợc gọi BSCNN a b x số bé tất BSC a b
2-Một số tập liên quan n USCLN v BSCNN
Bài 1: Viết chơng trình nhập vào hai số nguyên dơng X Y (1<=X,Y<=32767) In hình ớc số chung lớn cđa chóng
(17)Nếu sử dụng phơng pháp phân tích số cho thành thừa số nguyên tố tốn phức tạp, xin trình bày phơng pháp khác Để hiểu ph-ơng pháp này, ta bắt đầu ví dụ tìm USCLN hai số cụ thể 25 15
a b
25 15
10 (=25-15) 15
10 (=15-10)
5 (Dõng)
Qua ví dụ ta khái quát đợc cách giải toán: tìm USCLN hai số a b nh sau:
Lặp lại việc lấy a-b (nếu a>b) b-a (b>a) a=b Khi a USCLN hai giá trị a b ban đầu
Tht to¸n:
Bíc 1: NhËp a b
Bíc 2: Nếu a<>b lặp
Nếu a>b a:=a-b; Nếu b>a b:=b-a; Bớc 3: Trả lời: xuat(a);
Chơng trình
var x,y:longint; procedure nhap; begin
writeln('Nhap vao hai so nguyen duong '); readln(x,y);
end;
function ucln(a,b:longint):longint; begin
while a<>b do begin
if a>b then a:=a-b else b:=b-a; end;
ucln:=a; end;
BEGIN
nhap; writeln(ucln(x,y)); readln;
end.
NhËn xÐt:
-Khi a số lớn (chẳng hạn 2147483647) b số tự nhiên nhỏ (chẳng hạn 1) thuật tốn chạy chậm, lần lặp tr i c mt n v
-Để cải tiến, ta thay phÐp trõ b»ng phÐp lÊy sè d ThuËt toán cải tiến:
Bớc 1: Nhập a b
Bớc 2: Nếu a<>b lặp
Nếu a>b a:=a mod b; NÕu b>a th× b:=b mod a;
Bớc 3: Trả lời: a>0 xuat(a) ngợc lại xuat(b); VÝ dơ: T×m USCLN cđa hai sè thĨ 35 vµ 15
a b
(18)5 (=35 mod 15) 15
5 (=15 mod 5) (dừng)
Chơng trình cải tiến:
var x,y:longint;
function ucln(x,y:longint):longint; var sodu:longint;
begin
while y<>0 do begin
sodu:=x mod y; x:=y;
y:=sodu; end; ucln:=x end;
procedure nhap; begin
writeln('Nhap hai so nguyen duong '); readln(x,y);
end; begin
nhap; writeln(ucln(x,y)); readln;
end.
Bài 2: Cho tệp văn B2.INP có cấu trúc Dòng 1: Ghi số nguyên dơng N (1<=N<=100) Dòng 2: Ghi N số nguyên dơng (1<=ai<=32767)
Yêu cầu: In hình ớc số chung lớn N số tệp Phơng pháp:
Thực mở rộng tốn tìm USCLN hai số a b nh đợc trình bày
Tuy nhiên tốn có hai điểm khác: Thứ nhất, tìm USCLN dãy số Thứ hai, liệu vào đợc cho tệp
Việc đọc liệu từ xin khụng trỡnh by õy
Để giải tìm USCLN dÃy số, ta bắt đầu b»ng viƯc t×m USCLN cđa ba sè a b c
Giả sử x USCLN a b, ta viÕt x=USCLN(a,b)
Khi đó, để tìm USCLN a b c ta cần tìm USCLN x c y=USCLN(x,c)
Vậy, để tìm USCLN dãy số a[], ta thực hiện:
+ Tìm USCLN a[1] a[2]: x=USCLN(a[1],a[2]) + Duyệt từ n N: tớnh x=USCLN(x,a[i]);
Chơng trình
const fi='b2.inp'; var f:text;
uc,n:longint;
function ucnn(x,y:longint):longint; var sodu:longint;
begin
(19)begin
sodu:=x mod y; x:=y;
y:=sodu; end;
ucnn:=x; end;
procedure nhap; var i,u,v:longint; begin
assign(f,fi); reset(f); readln(f,n);
read(f,u);read(f,v); uc:=ucnn(u,v);
for i:=3 to n do begin
read(f,v); uc:=ucnn(uc,v); end;
close(f); end;
begin
nhap;writeln(uc);readln; end.
Bài 3: Viết chơng trình nhập vào hai số nguyên dơng X Y (1<=X,Y<=32767) Hãy kiểm tra xem hai số có phải hai số nguyên tố hay không? Phơng pháp:
Để thuận tiện việc giải toán, ta nhắc lại khái niệm hai số nguyên tố nhau: Hai số nguyên dơng a b đợc gọi nguyên tố ớc số chung lớn chúng
Nh vậy, để giải trớc hết ta phải tìm USCLN hai số a b Sau trả lời dựa vào kết tìm đợc: Nếu USCLN=1 hai số nguyên tố nhau, ngợc lại ta trả lời hai số khơng phải ngun tố
Ph¸t triĨn:
Ta đa thêm khái niệm: Dãy N số nguyên tố nh sau: Một dãy gồm N số đợc gọi nguyên tố USCLN tất số dóy bng
Yêu cầu: Cho dÃy gåm N sè nguyªn H·y xÐt xem d·y sè cã phải DÃy N số nguyên tố hay không?
Bài 4: Viết chơng trình nhập vào hai số nguyên dơng X Y (1<=X,Y<=32767) In hình bội số chung nhỏ chúng
Phơng pháp:
Để giải toán này, ta phải sử dụng kết toán học Đó là: BSCNN(a,b) = a*b/USCLN(a,b) Chẳng hạn BSCNN(15,25)=15*25/5=75
Vy, tớnh đợc BSCNN hai số nguyên dơng a b, ta cần tìm đ-ợc USCLN hai số Dựa vào phân tích chơng trình 1, ta gii quyt c bi ny
V-Hình học phẳng
(20)Để thuận lợi cho việc giải số toán phần tiếp theo, ta đa số khái niệm sở:
-Hỡnh tạo ba đoạn thẳng nối ba điểm không thẳng hàng đợc gọi hình tam giác
-Chu vi tam giác tổng độ dài ba cạnh tam giác
-Diện tích tam giác phần mặt phẳng bên đợc giới hạn ba cạnh tam giác
-Hình tạo n đoạn thẳng nối n điểm (n>3) đợc gọi hình đa giác (khơng có ba điểm thẳng hàng)
-Hình đa giác đợc gọi đa giác lồi ta theo cạnh đa giác điểm thuộc đa giác ln nằm phía
2-Mét sè bµi tËp liªn quan
Bài 1: Nhập số a, b, c Hãy kiểm tra xem ba số có phải độ dài ba cạnh tam giác hay khơng? Thơng báo lên hình “Phải” “Khơng phải”
Ph©n tÝch:
Thật đơn giản, ta thấy điều kiện để số độ dài ba cạnh tam giác số phải số dơng tổng độ dài hai cạnh ln lớn độ dài cạnh cịn lại
Phơng pháp:
Ch cn kim tra iu kiện thỏa mãn đồng thời a>0 b>0 c>0 a+b>c a+c>b b+c>a Chơng trình:
var a,b,c:real; begin
write('Hay nhap vao ba so '); readln(a,b,c);
if (a>0)and(b>0)and(c>0)and(a+b>c)and(c+b>a)and(a+c>b) then writeln('Day la dai ba canh cua mot tam giac ')
else writeln('Day khong la dai ba canh cua mot tg'); readln;
end.
Bài 2: Nhập số a, b, c Hãy kiểm tra xem ba số có phải độ dài ba cạnh tam giác hay khơng? Nếu phải tính chu vi diện tích tam giác
Ph©n tÝch:
Tơng tự nh ta phải xét xem ba số có phải độ dài ba cạnh tam giác
Nếu độ dài ba cạnh tam giác, ta thực hai nhiệm vụ: tính chu vi tính diện tích
ThuËt to¸n:
Bíc 1: NhËp ba sè a b c
Bớc 2: Nếu ba số độ dài ba cạnh tam giác: Tính chi vi CV
TÝnh diƯn tÝch DT XuÊt(CV,DT)
Bớc 3: Nếu ba số độ dài ba cạnh tam giác: Xuất(Khong phai dai ba canh);
Bài 3: Trên mặt phẳng, cho N điểm theo thứ tự N đỉnh đa giác lồi Viết chơng trình tính diện tích đa giác
(21)N dịng tiếp theo: Mỗi dòng ghi hai số x y hoành độ tung độ đỉnh đa giác (-30000 <= x, y <=30000) Hai số ghi cách dấu cách Dữ liệu ra: Ghi file văn DAGIAC.OUT, theo cấu trúc nh sau:
Dòng 1: Ghi diện tích tính đợc Phân tích:
Để dễ hiểu ta giả sử phải tính diện tích đa giác nh hình vẽ: y2
y1
y3
x1 x2 x3
SABC = SADEB + SBEFC - SADFC
= (y2+y1)*(x2-x1)/2 + (y3+y2)*(x3-x2)/2 - (y1+y3)*(x1-x3)/2
= (y2+y1)*(x2-x1)/2 + (y3+y2)*(x3-x2)/2 + (y3+y1)*(x3-x1)/2
Tơng tự ta lập cơng thức tính diện tích cho đa giác Để thuận tiện lập trình ta xem đỉnh nh n+1
Thuật toán:
Bớc 1: Đọc liệu file vào mảng chiều x[] y[] Đặt x[n+1]:=x[1]; y[n+1]:=y[1]; S:=0;
Bc 2: i vi đỉnh i ta tính tổng S:=S+(y[i]+y[i-1])*(x[i]-x[i-1])/2; Bớc 3: Trả lời: xuat(abs(S));
Chú ý: Khi đỉnh B ta giác ABC quay xuống phía dới diện tích ta tính đợc theo cơng thức số âm Vì trả lời kết ta phải lấy giá trị tuyệt đối
Chơng trình:
const fi='dagiac.inp'; fo='dagiac.out'; maxn=1000;
type mmc=array[1 maxn] of integer; var a,b:mmc;
n:word; f:text; s:real; procedure nhap; var i:integer; begin
assign(f,fi); reset(f);
readln(f,n);
for i:=1 to n readln(f,a[i],b[i]); close(f);
end;
procedure xuly; var i:integer; begin
a[n+1]:=a[1]; b[n+1]:=b[1]; s:=0;
for i:=2 to n+1 do
B A
C
(22)begin
s:=s+(b[i]+b[i-1])*(a[i]-a[i-1])/2; end;
end;
procedure xuat; begin
assign(f,fo); rewrite(f); write(f,abs(s):0:0);
close(f); end;
begin
nhap;xuly;xuat; end.
C - Một số tập bản. 1-Sè häc
Bài 1: Viết chơng trình nhập ba số In hình số lớn số nhỏ ba số
Bµi 2:Viết chơng trình tính N! (1<=N<=12)
Bài 3: Viết chơng trình giải toán Gà-Chó
Vừa gà, vừa chó Bó lại cho tròn Ba mơi sáu Một trăm chân chẵn Hỏi có gà, chó?
Bài 4: Viết chơng trình giải toán Trâu-Cỏ
Trm trõu trm c Trõu ng ăn năm Trâu nằm ăn ba Trâu già ba bó Hỏi có trâu loại?
Bài 5: Ngời ta định nghĩa tam giác Pascal bậc nh sau:
1
1
1 3
1
1 10 10
1 15 20 15
H·y lập trình in hình tam giác Pascal bậc 20
Bài 6: Viết chơng trình tính an Với a n số nguyên (1<=a,n<=10). Bài 7: Viết chơng trình in bảng cửu chơng 1->10
Bài 8: Viết chơng trình tính tổng hai số cã 300 ch÷ sè
Bài 9: Ngời ta viết số tự nhiên liên tục sát đợc dãy số vơ hạn S Viết chơng trình nhập số nguyên dơng N In hình chữ số thứ N dãy số vơ hạn S nói
2-Xử lý văn bản
Bài 1: Viết chơng trình nhập xâu ký tự In hình ký tự dòng
Bài 2: Viết chơng trình nhập xâu ký tự In hình từ dòng (từ nhóm ký tự dấu cách)
Bài 3: Viết chơng trình nhập xâu ký tự Đếm số từ có xâu
Bài 4: Viết chơng trình nhập xâu ký tự In hình từ dài nhÊt x©u
Bài 5: Viết chơng trình nhập xâu ký tự In hình dạng in hoa xâu ký tự
(23)Bài 7: Viết chơng trình nhập vào số nguyên dơng N In hình dịng chữ biểu diễn lời đọc số
Bài 8: Viết chơng trình nhập xâu ký tự Đếm số lần xuất ký tự xâu
Bài 9: Một xâu đợc gọi đối xứng ký tự giống đối xứng qua điểm xâu
Viết chơng trình nhập xâu In hình thơng báo “xâu đối xứng” “xâu khơng i xng
3-DÃy số
Bài 1: Viết chơng trình tạo dÃy số gồm N (1<=N<=100) phần tử có giá trị ngầu nhiên thuộc [1 32000]
D÷ liƯu ra: Ghi file RAN.OUT, cã cÊu tróc nh sau: Dòng 1: Ghi số N, số lợng phÇn tư cđa d·y
Dịng 2: Ghi N số ngẫu nhiên tìm đợc Các số ghi cách du cỏch
Bài 2: Viết chơng trình tìm giá trị lớn dÃy số Dữ liệu vào: Cho file LN.INP, cã cÊu tróc nh sau: Dßng 1: Ghi số N, số lợng phần tử dÃy
Dòng 2: Ghi N số nguyên giá trị N phần tử thuộc dÃy Các số ghi c¸ch
nhau bëi dÊu c¸ch
Dữ liệu ra: Ghi file văn LN.OUT, theo cấu trúc: Dòng 1: Ghi số lớn tìm đợc
Bài 3: Viết chơng trình đếm giá trị lớn dãy số Dữ liệu vào: Cho file DLN.INP, có cấu trúc nh sau: Dòng 1: Ghi số N, số lợng phần tử dãy
Dßng 2: Ghi N số nguyên giá trị N phần tử thuéc d·y C¸c sè ghi c¸ch
nhau bëi dÊu c¸ch
Dữ liệu ra: Ghi file văn DLN.OUT, theo cấu trúc: Dòng 1: Ghi số lợng giá tr ln nht tỡm c
Bài 4: Viết chơng trình in vị trí giá trị lớn dÃy số Dữ liệu vào: Cho file VTLN.INP, cã cÊu tróc nh sau:
Dßng 1: Ghi sè N, số lợng phần tử dÃy
Dòng 2: Ghi N số nguyên giá trị N phần tử thuộc dÃy Các số ghi cách
nhau bëi dÊu c¸ch
Dữ liệu ra: Ghi file văn VTLN.OUT, theo cấu trúc: Dòng 1: Ghi số M số lợng giá trị lớn tìm c
Dòng 2: Ghi M số nguyên ik số M phần tử có giá trị lớn nhÊt thuéc
d·y C¸c sè ghi c¸ch bëi dấu cách
Bài 5: Viết chơng trình tìm giá trị lớn thứ nhì dÃy số Dữ liệu vào: Cho file LN2.INP, cã cÊu tróc nh sau: Dßng 1: Ghi số N, số lợng phần tử dÃy
Dòng 2: Ghi N số nguyên giá trị N phần tử thuộc dÃy Các số ghi c¸ch
nhau bëi dÊu c¸ch
Dữ liệu ra: Ghi file văn LN2.OUT, theo cấu trúc: Dịng 1: Ghi giá trị lớn nhì tìm đợc
Bài 6: Sắp xếp dãy số theo thứ tự giảm dần, số lợng số giống khơng quỏ 255
Dữ liệu vào: Cho file văn SAPDAY.INP, có cấu trúc: Dòng 1: Ghi số N, số lợng phần tử dÃy
Dòng 2: Ghi N số nguyên giá trị N phần tử thuộc dÃy Các số ghi cách
nhau bëi dÊu c¸ch
(24)Dịng 1: Ghi N số nguyên giá trị N phần tử thuộc dãy sau
xÕp C¸c sè ghi c¸ch bëi dÊu c¸ch
D-Mét sè tập tuyển chọn
Câu 1: GAPGIAY.PAS
Cú tờ giấy dày a (mm) (0.001<a<5) Hỏi phải gấp đơi tờ giấy lần để đợc độ dày lớn b (cm) (0.001<b<10) Kết xuất hình
VÝ dơ: NhËp a=1 b=1 Xt: Số lần phải gấp là: Chơng trình gỵi ý:
var a,b:real; d:word; begin
write('Hay nhap vao dai ban dau (mm) a=');readln(a); write('Hay nhap vao dai can co (cm) b=');readln(b); b:=10*b;
d:=0;
while a<b do begin
a:=a*2; d:=d+1; end;
writeln('Sau it nhat la ',d,' lan gap '); readln;
end.
Test gợi ý:
a b Số lần gấp
0.1
1
20
1 0.2
Câu 2: USCLN.PAS
Ước sè chung lín nhÊt cđa d·y gåm N sè nguyªn dơng A1,A2,,An số nguyên dơng U lớn cho với giá trị i (i=1 N) th× Ai chia hÕt cho U
Cho mét file văn có tên USCLN.INP có cấu trúc nh sau: Dòng 1: Chứa số N (N nguyên dơng, N<51)
Dòng 2: Chứa N số Ai (Ai nguyên dơng, 0<Ai<65536), số ghi cách dấu c¸ch trèng
Hãy viết chơng trình đọc N số từ file tìm ớc số chung lớn dãy N số u cầu chơng trình chạy không giây
Kết xuất file có tên USCLN.OUT có cấu trúc: Dịng 1: Chứa số U ớc số chung lớn tìm đợc
VÝ dô:
USCLN.INP USCLN.OUT
6
100 25 50 30 Chơng trình gợi ý:
const fi='USCLN.INP '; fo='USCLN.OUT';
type mmc=array[1 100] of longint; var a:mmc;
(25)assign(f,fi); reset(f); readln(f,n);
for i:=1 to n read(f,a[i]); close(f);
end;
function uc(x,y:longint):longint; begin
while x<>y do begin
if x>y then x:=x-y else y:=y-x; end;
uc:=x; end;
procedure xuly; var i:byte;
u,uhs:longint; begin
u:=uc(a[1],a[2]);
for i:=3 to n u:=uc(u,a[i]); writeln('UCLN la' ,u);
assign(f,fo); reset(f); readln(f,uhs); close(f);
if u=uhs then write('1 diem') else write('0 diem'); readln;
end; begin doc; xuly; end.
C©u 3: TANSO.PAS
Ngêi ta nãi tÇn sè cđa mét sè A mét d·y sè A1, A2, …,An số lần xuất số A dÃy A1,A2,…,An
VÝ dô: Cho d·y sè 3 TÇn sè cđa sè Tần số số
Cho file văn có tên TANSO.INP có cấu trúc nh sau: Dòng 1: Chứa số nguyên N dơng (0<N<=10000)
N dòng tiếp theo: dòng chứa số nguyên Ai (0<Ai<101), số ghi cách Ýt nhÊt mét dÊu c¸ch trèng
Hãy viết chơng trình đọc file tìm tần số xuất số N số cho Yêu cầu chơng trình chạy khơng q giây
Kết xuất file văn TANSO.OUT gồm nhiều dòng Mỗi dòng chứa số Ai Ki ghi cách dấu cách trống Trong Ai số thuộc dãy, Ki tần số số Ai Ai đợc xếp tăng dần từ đầu đến cuối file Ví dụ:
TANSO.INP TANSO.OUT
9
2 3
6
6
6
Chơng trình gọi ý:
(26)const fi='Tanso.inp'; fo='Tanso.out';
type mmc=array[0 100] of word; var a:mmc;
f:text; n,d:word; procedure doc; var i,x:word; begin
for i:=0 to 100 a[i]:=0; assign(f,fi);
reset(f); readln(f,n);
for i:=1 to n begin read(f,x); a[x]:=a[x]+1;end; close(f);
d:=0;
for i:=1 to 100 do
if a[i]>0 then d:=d+1; {assign(f,fo);
rewrite(f);
for i:=1 to 100 do
if a[i]>0 then writeln(f,i,' ',a[i]); close(f);}
end;
procedure tt; var i:word; begin
randomize; n:=10000; assign(f,fi); rewrite(f); writeln(f,n);
for i:=1 to n write(f,random(99)+1,' '); close(f);
end;
procedure cham; var i,diem:word; ahs,khs:mmc; begin
assign(f,fo); reset(f);
for i:=1 to d read(f,ahs[i],khs[i]); close(f);
diem:=0;
for i:=1 to d if (a[ahs[i]]<>khs[i]) then diem:=diem+1; if diem=0 then writeln('1 diem');
if diem=1 then writeln('0.5 diem'); if diem>1 then writeln('0 diem'); end;
begin doc; cham; readln; end.
C©u 4: NT.PAS
(27)Dịng 1: Chứa số N, số lợng số nguyên tố tìm đợc
Dịng 2: Ghi số ngun tố tìm đợc, số ghi cách dấu cỏch trng
Chơng trình gợi ý:
{$R+}
const n=60000;
type mmc=array[1 n] of boolean; var a:longint;
b:mmc; f:text; procedure nt2;
var i,j,x,d,sl:longint; begin
for i:=1 to n b[i]:=true; b[1]:=false;
for i:=2 to n do begin
if b[i]=true then
for j:=i to (n div i) b[i*j]:=false; end;
sl:=0;
for i:=1 to n do
if b[i]=true then sl:=sl+1; {xuat}
{assign(f,'NT.OUT'); rewrite(f);
for i:=1 to n if b[i]=true then write(f,i,' '); close(f);}
{cham}
assign(f,'NT.OUT'); reset(f);
d:=0;
while not seekeof(f) do begin
read(f,x);
if b[x]=false then d:=d+1; end;
if d=0 then writeln('2 diem');
if (0<d) and (d<=sl div 2) then write('1 diem '); if d>sl div then write('0 diem ');
close(f); end; begin nt2; readln; end.
Câu 5: TOT.PAS
Có băng giấy gồm N ô (1<N<30) Một tốt bên trái băng giấy Con tốt có loại bớc đi:
Bớc loại 1: từ ô i sang ô i+1 Bớc loại 2: từ ô i sang ô i+2
Viết chơng trình nhập số N (Số lợng ô băng giấy) tìm số cách di chuyển tốt từ bên trái sang bên phải băng giấy Kết xuất hình
(28)VÝ dơ: N= Sè c¸ch di chun tốt: 13 Chơng trình gợi ý:
type mmc=array[0 31] of longint; var a:mmc;
i,j,n:byte; begin
write('Hay nhap so o cua bang giay '); readln(n);
a[0]:=1; a[1]:=1;
for i:=2 to n+1 a[i]:=a[i-1]+a[i-2]; writeln('So cach di chuyen la ',a[n+1]); readln;
end.
Test gợi ý:
N Số cách di chuyển
10 144
20 17711
30 2178309
29 1346269
C©u 6: TAPCON.PAS
Một tập S gồm N phần tử A1,A2, ,An, tập S1 gồm M phần tử B1,B2, Bm đợc gọi “tập phân biệt” tập S nếu:
+ Mäi i (i=1 m) Bi thuộc tập S
+ Mọi j, k (j, k=1 m) mà j<>k Bj<>Bk VÝ dô: S={1 2}
S1={1 5} tập ph©n biƯt cđa S
S2={1 2} tập phân biệt S Cho file văn có tên TAPCON.INP có cấu trúc nh sau: Dòng 1: chứa số nguyên dơng N(0<n<10001), số lợng phần tử tập S
Dòng 2: chứa N số nguyên dơng Ai (0<A[i]<20001) C¸c sè ghi c¸ch Ýt nhÊt mét dÊu c¸ch trèng
Viết chơng trình đọc file tìm tập S1 phân biệt tập S gồm N số cho S1 có số lợng phần tử nhiều
KÕt qu¶ xuÊt file TAPCON.OUT cã cÊu tróc nh sau:
Dịng 1: Số M, số lợng phần tử thuộc tập phân biệt tìm đợc
Dịng 2: Gồm M số Bi giá trị phần tử tập phân biệt tìm đợc Các số ghi cách dấu cách trống
VD:
TAPCON.INP TAPCON.OUT
8
1 6 4 Chơng trình gợi ý:
{$R+}
const fi='TAPCON.IN1'; fo='TAPCON.OUT'; max=20000;
type mmc=array[1 max] of boolean; var a,hs:mmc;
n,m,d:longint; f:text;
procedure tt; var i:longint; begin
(29)rewrite(f); randomize; n:=5000; writeln(f,n);
for i:=1 to n write(f,random(20000)+1,' '); close(f);
end;
procedure doc; var i,x:longint; begin
for i:=1 to max a[i]:=false; assign(f,fi);
reset(f); readln(f,n); for i:=1 to n do begin
read(f,x); a[x]:=true; end;
close(f); {xuat file} {assign(f,fo); rewrite(f); for i:=1 to n do
if a[i]=true then write(f,i,' '); close(f);}
{cham}
assign(f,fo); reset(f); readln(f,m); d:=0;
for i:=1 to m do begin
read(f,x);
if a[x]=false then d:=d+1; end;
if d=0 then writeln('1 diem') else writeln('0 diem'); close(f);
readln; end; begin doc; end.
Câu 7: Hai xâu tơng đơng - XAUTD.PAS
Ngời ta định nghĩa hai xâu tơng đơng nh sau: Xâu A xâu B đợc gọi t-ơng đt-ơng tồn cách xếp ký tự xâu A để thu đợc xâu B tồn xếp ký tự xâu B để thu đợc xâu A
Ví dụ: Xâu ABC tơng đơng với xâu BCA Cho hai xâu A B thỏa mãn điều kiện sau:
+Có độ dài n 1<=n<=10000
+Các ký tự xuất xâu gồm ký tự in hoa từ ‘A’ đến ‘Z’ Hãy xét xem hai xâu A B có tơng đơng với hay khơng?
Dữ liệu vào: Cho file XAUTD.INP có cấu trúc nh sau: +Dòng 1: Ghi số n, độ dài xâu
(30)D÷ liƯu ra: Ghi file XAUTD.OUT theo cÊu tróc nh sau:
+Dịng 1: Ghi xâu A tơng đơng với xâu B, ghi xâu A không t-ơng đt-ơng với xâu B
VÝ dô:
XAUTD.INP XAUTD.OUT
3 ABC BAC
1
4 XNYZ YNYZ
0
Chơng trình gợi ý:
const fi='xautd.in6'; fo='xautd.ou6'; type mmc=array['A' 'Z'] of word; var f:text; n:word; m1,m2:mmc; procedure doc;
var i:word;c:char; begin
assign(f,fi);reset(f); readln(f,n);
fillchar(m1,sizeof(m1),0); for i:=1 to n
begin
read(f,c);
m1[c]:=m1[c]+1; end;
readln(f); for i:=1 to n begin
read(f,c);
m2[c]:=m2[c]+1; end;
close(f); end;
procedure xl; var i:char; kq:byte; begin
kq:=1;
for i:='A' to 'Z'
if m1[i]<>m2[i] then begin kq:=0; break; end; assign(f,fo);
rewrite(f); write(f,kq); close(f); end;
begin doc; xl; end
(31)Trong mặt phẳng, cho n điểm Hãy xác định xem, theo thứ tự điểm chúng có tạo đợc đa giác lồi hay khơng? Nếu đợc tính diện tích đa giác lồi
D÷ liƯu vào: Đợc cho file POLYGON.INP có cấu trúc nh sau: -Dßng 1: Ghi sè n (3<=n<=100)
-n dịng tiếp theo: dòng số bi toạ độ điểm thứ i Hai số ghi cách
ít dấu cách (-2000<=ai ,bi <=2000)
Dữ liƯu ra: Ghi file POLYGON.OUT theo cÊu tróc nh sau:
-Dòng 1: Ghi số theo thứ tự n điểm không tạo đợc đa giác lồi Ghi số theo thứ tự n điểm tạo đợc đa giác lồi
-Dòng 2: Nếu theo thứ tự n điểm tạo đợc đa giác lồi ghi diện tích đa giác (tính xác đến chữ số thập phân)
VÝ dô:
POLYGON.INP POLYGON.OUT
0 0
1 0.50
4 0 0 -1 -1
0
Chơng trình gợi ý: const fi='polygon.in6'; fo='polygon.ou6'; maxn=1000;
type mmc=array[1 maxn] of longint;
var a,b:mmc; n:word; dt:real;f:text; loi:boolean; procedure doc;
var i:word; begin
assign(f,fi); reset(f); readln(f,n);
for i:=1 to n readln(f,a[i],b[i]); close(f);
end;
function dientich:real;
var i:word; s:real;t1,t2:longint; begin
s:=0;
for i:=1 to n begin
t1:=(b[i]+b[i+1]); t2:=(a[i+1]-a[i]); s:=s+(t1/2)*t2;
end;
dientich:=s; end;
procedure xuly;
(32)begin
a[n+1]:=a[1]; b[n+1]:=b[1]; a[n+2]:=a[2];
b[n+2]:=b[2];
d1:=0;d2:=0;d0:=0;loi:=false; for i:=1 to n
begin
d:=(a[i+1]-a[i])*(b[i+2]-b[i])-(a[i+2]-a[i])*(b[i+1]-b[i]); if d>0 then inc(d1);
if d<0 then inc(d2); if d=0 then inc(d0); end;
if d0<n then
if (d0+d1=n) or (d0+d2=n) then begin
loi:=true; dt:=dientich; end;
end;
procedure xuat; begin
assign(f,fo); rewrite(f); if loi=true then begin
writeln(f,1);
writeln(f,abs(dt):0:2); end
else write(f,0); close(f);
end; begin
doc; xuly; xuat; end
C©u 9: D·y A2n DAYA2N.PAS
D·y A2n dÃy số thỏa mÃn tính chất sau: + Gåm 2n+1 phÇn tư a0, a1, , a2n
+ a0 = a2n =
+ nguyên, không âm có | – ai+1| =1 víi mäi i=0 2n-1
VÝ dơ: víi n = ta cã d·y sè:
1) 1 2) 1 3) 1 4) 2 5) Yêu cầu: Cho trớc số n, hÃy tìm số lợng dÃy A2n
Dữ liệu vào: Cho file DAYA2N.INP cã cÊu tróc nh sau: - Dßng 1: Ghi mét sè n (1<=n<=19)
(33)-Dòng 1: Ghi số S số lợng dãy số A2n tìm đợc Ví dụ:
DAYA2N.INP DAYA2N.OUT
3
Chơng trình gợi ý:
const fi='DAY2N.IN4'; fo='DAY2N.OU4';
type mhc=array[0 60,0 60] of longint; var f:text;
n:word; a:mhc; procedure doc; begin
assign(f,fi); reset(f); readln(f,n); close(f); n:=n+1; end;
procedure xl; var i,j:word; begin
for i:=1 to n a[1,i]:=1; for i:=2 to n
for j:=i to n if i=j then a[i,j]:=a[i-1,j] else a[i,j]:=a[i,j-1]+a[i-1,j]; end;
procedure xuat; var i,j:word; begin
assign(f,fo); rewrite(f);
writeln(f, a[n,n]); close(f);
end; begin
doc; xl; xuat; end
Câu 10: Tổng giá trị phần tử mét ma trËn - SUM.PAS
Cho ma trận A gồm M dòng N cột Dòng đợc đánh số từ đến M từ xuống dới Cột đợc đánh số từ đến N từ trái qua phải Mỗi phần tử ma trận có giá trị ngun Hãy tính tổng giá trị phần tử có số dòng chẵn số cột lẽ
Dữ liệu vào: Cho file SUM.INP có cấu trúc nh sau:
-Dòng 1: Ghi hai giá trị M N, số dòng số cột ma trận, c¸c sè ghi c¸ch mét dÊu c¸ch (2<=M, N<=100)
-M dòng tiếp theo: dòng ghi N số nguyên x, giá trị phần tử dòng ma trận, số ghi cách mét dÊu c¸ch
(34)Dữ liệu ra: Ghi file SUM.OUT theo cấu trúc nh sau: -Dịng 1: Ghi số S, tổng tìm đợc
VÝ dô:
SUM.INP SUM.OUT
4 31
2 2 8
{$r+}
const fi='Sum.in2'; fo='sum.ou2'; nn=100;mm=100;
type mhci=array[1 mm,1 nn] of integer; var a:mhci;
m,n:byte; s:longint; procedure doc;
var f:text; i,j:byte; begin
assign(f,fi);reset(f); readln(f,m,n);
for i:=1 to m do begin
for j:=1 to n read(f,a[i,j]); readln(f);
end; close(f); end;
procedure xl; var i,j:byte; begin
s:=0;
for i:=1 to m do begin
for j:=1 to n do
if (i mod 2=0) and (j mod 2=1) then s:=s+a[i,j]; end;
end;
procedure xuat;
var i,j:byte; f:text; begin
assign(f,fo); rewrite(f); writeln(f,s);
close(f); end; begin doc; xl; xuat; readln; end.
(35)SUM.INP SUM.OUT
5 5
2 7 2 5 1 0 9 3 8 7
31
6 5
2 7 2 5 1 0 9 3 8 7 3 -1 -2 -3 -4
28
4 5
4 2 -1 10 4 -20 6 -19 13 20 -20 2
15
Câu 11: Số nguyên tố NT.PAS
Tỡm tt số tự nhiên X có ba chữ số cho đảo ngợc trật tự chữ số X ta thu đợc số nguyên Y mà X Y hai số nguyên tố
VÝ dơ: X=122 vµ Y= 221
Dữ liệu ra: Ghi file NT.OUT theo cấu trúc nh sau: -Dòng 1: Ghi số nguyên dơng N, số lợng số X tìm đợc
-Dịng 2: Ghi N số tìm đợc Các số ghi cách dấu cách
const fo='NT.OUT'; nn=901;
type mmcw=array[0 901] of word; var n:word; s:mmcw;
function uscln(a,b:word):word; var r:word;
begin
while b>0 do begin r:=a mod b; a:=b;
b:=r; end;
uscln:=a; end;
function dao(x:word):word; var y:word;
begin y:=0;
while x>0 do begin
y:=10*y+(x mod 10); x:=x div 10;
end; dao:=y; end;
(36)var x,d:word; begin
d:=0;
for x:=100 to 999 do
if uscln(x,dao(x))=1 then begin
d:=d+1; s[d]:=x; end;
tim:=d; end;
procedure xuat; var f:text; i:word; begin
n:=tim;
assign(f,fo);rewrite(f); writeln(f,n);
for i:=1 to n write(f,s[i],' '); close(f);
end; begin xuat; end.
Câu 12: Sắp xếp x©u – STR.PAS
Cho xâu mẫu S gồm N ký tự đợc lấy từ tập ký tự ‘A’ ‘Z’ Với cặp số nguyên (i,j) (1<=i,j<=N), ta tạo xâu thứ cấp S’ cách đổi chỗ phần tử thứ i với phần tử thứ j xâu mẫu S Với M cặp số (i,j) ta s thu -c M xõu th cp
Yêu cầu: Sắp xếp xâu thứ cấp tăng dần theo thứ tự từ điển Dữ liệu vào: Cho file STR.INP có cấu trúc nh sau: -Dòng 1: Ghi giá trị N, số ký tự xâu S (1<=N<=500) -Dòng 2: Ghi xâu mẫu S
-Dòng 3: Ghi giá trị M, số lợng cặp số (i, j) (1<=M<=500)
-M dòng tiếp theo: dòng ghi cặp số i j lần lợt số phần tử thứ i số phần tử thứ j cần đổi chỗ xâu S Hai số ghi cách dấu cách
D÷ liƯu ra: Ghi file STR.OUT theo cÊu tróc nh sau:
-M dòng: Mỗi dòng ghi xâu thứ cấp, dòng đợc tăng dần theo thứ tự từ điển
VÝ dô:
STR.INP STR.OUT
5 ABCDA
ABCDA ABCDA
3 ADCBA
2 3
{$r+}
program sap_xau;
const fi='str.in5'; fo='str.ou5';
(37)var d,s,b,c,tg1:mmcc; l,r:mmci;
n,m:integer; f:text; procedure nhap; var i,j:integer; begin
assign(f,fi); reset(f); readln(f,n);
for i:=1 to n read(f,s[i]); readln(f);
readln(f,m);
for i:=1 to m readln(f,l[i],r[i]); close(f);
end;
procedure doicho(var x,y:char); var tg:char;
begin
tg:=x; x:=y; y:=tg; end;
procedure xl;
var i,j,k,tg:integer; begin
for i:=1 to m-1 do begin
b:=s;
doicho(b[l[i]],b[r[i]]); for j:=i+1 to m do
begin c:=s;
doicho(c[l[j]],c[r[j]]); for k:=1 to n do
begin
if b[k]>c[k] then begin
tg:=l[i];l[i]:=l[j];l[j]:=tg; tg:=r[i];r[i]:=r[j];r[j]:=tg; tg1:=b;b:=c;c:=tg1;
break; end;
if b[k]<c[k] then break; end;
end; end;
assign(f,fo); rewrite(f); for i:=1 to m do
begin d:=s;
doicho(d[l[i]],d[r[i]]);
(38)end; close(f); end;
begin nhap; xl; end.
Câu 13: Đếm sè tõ cã x©u-WORD.PAS
Ta định nghĩa: Từ nhóm ký tự mà khơng chứa dấu cách Ví dụ ‘thch’ từ
Cho xâu S gồm N ký tự đợc lấy từ tập ký tự ‘a’ ’z’ ‘ ’ (du cỏch), (1<=N<=255)
Yêu cầu: Đếm số lợng từ có xâu in file từ dòng Dữ liệu vào: Cho file WORD.INP có cấu trúc nh sau:
-Dòng 1: Ghi xâu S
Dữ liệu ra: Ghi file WORD.OUT theo cấu trúc nh sau: -Dòng 1: Ghi số K số lợng từ đếm đợc có xâu -K dịng tiếp theo, dịng ghi từ
VÝ dơ:
WORD.INP WORD.OUT
bien hoc khong bo bien hoc khong bo Chơng trình gợi ý
const fi='word.in5'; fo='word.ou5'; var s:string;
f:text; d:byte; procedure doc; begin
assign(f,fi); reset(f); readln(f,s); close(f); end;
procedure xl; var i:byte; begin
while s[1]=' ' delete(s,1,1);
while s[length(s)]=' ' delete(s,length(s),1); while pos(' ',s)<>0 delete(s,pos(' ',s),1); assign(f,fo);
rewrite(f);
if s= '' then d:=0 else d:=1;
for i:=1 to length(s) if s[i]=' ' then d:=d+1; writeln(f,d);
for i:=1 to length(s) do begin
write(f,s[i]);
(39)end; close(f); end;
begin doc; xl; end.
C©u 14: D·y – DAYCON.PAS
Cho hai dãy số thực a1, a2, ,an (1) b1, b2, ,bm (2) Dãy (1) đợc gọi
dãy dãy (2) bỏ k (k>=0) phần tử dãy (2) ta đợc dãy (1) Chằng hạn: dãy 1, 3, dãy dãy 0,1, 2, 1, 4, 3, 5,
Yêu cầu: Với hai dãy số cho trớc, xác định xem dãy (1) có phải dãy ca dóy (2) hóy khụng
Dữ liệu vào: Cho file DAYCON.INP cã cÊu tróc nh sau: -Dßng 1: Ghi số N số lợng phần tử d·y (1) (1<=N<=1000) -Dßng 2: Ghi N sè a1 a2 an, c¸c sè ghi c¸ch mét dÊu c¸ch
-Dòng 3: Ghi số M số lợng phần tư cđa d·y (2) (1<=M<=1000) -Dßng 4: Ghi M sè b1 b2 bm, c¸c sè ghi c¸ch mét dấu cách
Dữ liệu ra: Ghi file DAYCON.OUT theo cÊu tróc nh sau:
-Dßng 1: Ghi ký tù ‘Y’ nÕu d·y (1) lµ d·y cđa d·y (2), ngợc lại ghi ký tự N
Ví dụ:
DAYCON.INP DAYCON.OUT
3 Y
1
0 Chơng trình gợi ý
const fi='daycon.in6'; fo='daycon.ou6';
type mmcr=array[1 1000] of real; var f:text;
a,b:mmcr; n,m:word; procedure doc; var i:word; begin
assign(f,fi); reset(f); readln(f,n);
for i:=1 to n read(f,a[i]); readln(f);
readln(f,m);
for i:=1 to m read(f,b[i]); close(f);
end;
function tim(x:real;var j:word):word; begin
while (j<=m) and (x<>b[j]) j:=j+1; tim:=j;
end;
procedure xl;
(40)j:=1; kt:='Y'; for i:=1 to n do begin
if (tim(a[i],j)>m) then kt:='N'; end;
assign(f,fo); rewrite(f); writeln(f,kt);
close(f); end; begin
doc; xl; readln; end.
Câu 15: Đếm hình vng nhìn thấy đợc từ gốc tọa độ SQUARES.PAS Trong mặt phẳng tọa độ cho N hình vng có cạnh song song với trục tọa độ Các hình vng đợc đánh số từ đến N Các đỉnh hình vng có tọa độ ngun khơng có hai hình vng có điểm chung
Một hình vng đợc gọi nhìn thấy đợc từ gốc tọa độ O=(0,0), tìm đ-ợc hai điểm A, B số cạnh hình vng cho phần tam giác OAB khơng có điểm chung với hình vng hình vng cịn lại
u cầu: Tìm số lợng hình vng nhìn thy c t gc ta
Dữ liệu vào: Cho file SQUARES.INP cã cÊu tróc nh sau: -Dßng 1: Ghi số nguyên N (1<=N<=1000), số lợng hình vu«ng
-Trong N dịng tiếp theo: dịng thứ i ghi số nguyên Xi Yi Li, (Xi , Yi)
là tọa độ đỉnh góc dới bên trái hình vng thứ i, Li di cnh ca
hình vuông thứ i Các sè ghi c¸ch mét dÊu c¸ch (1<= Xi Yi Li <=1000) D÷ liƯu ra: Ghi file SQUARES.OUT theo cÊu tróc nh sau:
-Dịng 1: Ghi số M, số lợng hình vng nhìn thấy đợc từ gốc tọa độ
-Dòng 2: Ghi M số, số hiệu hình vng nhìn thấy đợc từ gốc tọa độ Các số ghi cách dấu cách
VÝ dô:
SQUARES.INP SQUARES.OUT SQUARES.INP SQUARES.OUT
3
2 3 1
1 1
3 4
3 Chơng trình gợi ý:
{$r+}
program Cac_hinh_chu_nhat_co_the_nhin_thay_tu_goc_toa_do; const fi='squares.in7';
fo='squares.ou7';
type ii=integer; bo=boolean; rr=real; mmc=array[0 1001] of ii;
mmc1=array[0 1001] of bo; mmc2=array[0 1001] of rr;
var x1,y1,x2,y2,e:mmc; b:mmc1; g1,g2:mmc2; n:ii;
(41)begin
assign(f,fi); reset(f); readln(f,n); for i:=1 to n do begin
readln(f,x,y,l); x1[i]:=x;
y1[i]:=y+l;
x2[i]:=x+l; y2[i]:=y;
end; close(f); end;
procedure sort(l,r:integer); var i,j,x,y:integer;
begin i:=l; j:=r;
x:=x1[(l+r) div 2]+ y1[(l+r) div 2]; repeat
while x1[i]+y1[i]<x i:=i+1; while x<x1[j]+y1[j] j:=j-1; if i<=j then
begin
y:=x1[i]; x1[i]:=x1[j]; x1[j]:=y; y:=y1[i]; y1[i]:=y1[j]; y1[j]:=y; y:=x2[i]; x2[i]:=x2[j]; x2[j]:=y; y:=y2[i]; y2[i]:=y2[j]; y2[j]:=y; y:=e[i]; e[i]:=e[j]; e[j]:=y; i:=i+1; j:=j-1;
end; until i>j;
if l<j then Sort(l,j); if i<r then Sort(i,r); end;
procedure tinhgoc; var i:ii;
begin
for i:=1 to n do begin
if x1[i]=0 then g1[i]:=90
else g1[i]:=arctan(y1[i]/x1[i]); if x2[i]=0 then g2[i]:=90
else g2[i]:=arctan(y2[i]/x2[i]); end;
end;
procedure quet(x,y:real); var i:ii;
begin
(42)if (g1[i]>x) and (g2[i]<y) then begin
b[i]:=true; quet(x,g2[i]); quet(g1[i],y); break;
end; end;
procedure xl; var i,j,dem:ii; begin
for i:=1 to n e[i]:=i; writeln;
sort(1,n); tinhgoc;
fillchar(b,sizeof(b),false); quet(0,pi/2);
dem:=0;
for i:=1 to n do
if b[i] then inc(dem); assign(f,fo);
rewrite(f); writeln(f,dem); for i:=1 to n do
if b[i] then write(f,e[i],' '); close(f);
end; begin doc; xl; end.
C©u 16: Sè nguyªn tè cïng - NT.PAS
Tìm tất số tự nhiên X có ba chữ số cho đảo ngợc trật tự chữ số X ta thu đợc số nguyên Y mà X Y hai số nguyên tố
VÝ dơ: X =122 vµ Y= 221
Dữ liệu ra: Ghi file NT.OUT theo cấu trúc nh sau: - Dòng 1: Ghi số nguyên dơng N, số lợng số X tìm đợc
- Dịng 2: Ghi N số tìm đợc Các số ghi cách dấu cách Chơng trình gợi ý:
const fo='NT.OUT'; nn=901;
type mmcw=array[0 901] of word; var n:word; s:mmcw;
function uscln(a,b:word):word; var r:word;
begin
while b>0 do begin
r:=a mod b; a:=b;
(43)uscln:=a; end;
function dao(x:word):word; var y:word;
begin y:=0;
while x>0 do begin
y:=10*y+(x mod 10); x:=x div 10;
end; dao:=y; end;
function tim:word; var x,d:word; begin
d:=0;
for x:=100 to 999 do
if uscln(x,dao(x))=1 then begin
d:=d+1; s[d]:=x; end;
tim:=d; end;
procedure xuat; var f:text; i:word; begin
n:=tim;
assign(f,fo); rewrite(f); writeln(f,n);
for i:=1 to n write(f,s[i],' '); close(f);
end; begin
xuat; end.
Câu 17 Tìm số sát sau - SOSATSAU.PAS
Cho số tự nhiên A có N chữ số Hãy hoán vị chữ số A để thu đợc số B thoả mãn đồng thời hai điều kiện sau:
- B lín h¬n A - B nhỏ
Dữ liệu vào: Cho file Sosatsau.inp cã cÊu tróc nh sau:
- Dßng 1: Ghi số N số lợng chữ số A (0<N<=1000)
- Dòng 2: Ghi chữ số số A, chữ số dấu cách Dữ liệu ra: Ghi vào file Sosatsau.out theo cấu tróc:
- Dịng 1: Ghi số B tìm đợc, chữ số khơng có dấu cách Nếu khơng tìm đợc số B ghi chữ số
VÝ dô
Sosatsau.inp Sosatsau.out Sosatsau.inp Sosatsau.out
6
526431
531246
21
(44)Chơng trình gợi ý:
const
max=1000;
fi='sosatsau.inp'; fo='sosatsau.out'; var
a:array[0 max]of char; n:integer;
kt:boolean; Procedure docdl; var
f:text; c:char; i:integer; begin
assign(f,fi); reset(f); readln(f,n); i:=0;
while not eof(f) do begin
read(f,c);
if(c>='0') and(c<='9') then begin
inc(i); a[i]:=c; end;
end; close(f); end;
procedure kiemtra; var
i,j:integer; tg:char; begin
kt:=false; i:=n-1;
while a[i]>=a[i+1] do dec(i);
if i<>0 then begin
j:=n;
while a[j]<=a[i] do dec(j);
tg:=a[i]; a[i]:=a[j]; a[j]:=tg; inc(i); j:=n;
while j>i do begin
(45)a[j]:=tg; inc(i); dec(j); end;
kt:=true; end;
end;
procedure xuatdl; var
f:text; i:integer; begin
assign(f,fo); rewrite(f); if kt then
for i:=1 to n do write(f,a[i]) else
write(f,'0'); close(f);
end; begin
docdl; kiemtra; xuatdl; end.
Test gỵi ý:
SOSATSAU.INP SOSATSAU.OUT
5 54321
0 6
724356
724365 1
7
0 4
1234
1243
Câu 18 Giải mà chuỗi nhị phân - NHIPHAN.PAS
Mi thụng tin đợc mã hoá dới dạng chuỗi số nhị phân Để nâng cao độ tin cậy truyền tin, bít đợc biểu diễn lặp lại lần Ví dụ, bít tin ‘011’ đợc biểu diễn thành ‘000111111’ để thực truyền Do nhiễu môi tr-ờng nên đến đích, bít tin bị sai lệch Vì vậy, nhận đợc thơng tin đoạn bít đợc giải mã thành bít Bít có giá trị nhóm bít xuất bít 0, bít có giá trị nhóm bít xuất bít Ví dụ, bít tin nhận đợc ‘000110010011’, sau giải mã ta thu đợc ‘0101’
Yêu cầu: Cho chuỗi nhị phân biểu diễn thông tin nhận đợc, giải mó chui nh phõn ú
Dữ liệu vào: Cho file Nhiphan.inp cã cÊu tróc nh sau:
-Dßng 1: Ghi chuỗi nhị phân cần giải mÃ, dÃy số 0, ghi liền Dữ liệu ra: Ghi file Nhiphan.out theo cÊu tróc nh sau:
-Dòng 1. Ghi chuỗi nhị phân đợc giải mã, dãy số 0, ghi liền
(46)Nhiphan.inp Nhiphan.out
001111010110111000 010110 Chơng trình gợi ý:
const
fi='nhiphan.inp'; fo='nhiphan.out'; var
st,s1:string; procedure docdl; var
f:text; begin
assign(f,fi); reset(f); readln(f,st); close(f); end;
function mahoa(kt1,kt2,kt3:char):char; var
t:byte; begin t:=0;
if kt1='1' then t:=t+1; if kt2='1' then t:=t+1; if kt3='1' then t:=t+1; if t>=2 then mahoa:='1' else
mahoa:='0'; end;
procedure xuli; var
ll,l,i:integer; begin
ll:=length(st); l:=1;
s1:='';
while l<ll do begin
s1:=s1+mahoa(st[l],st[l+1],st[l+2]) ; l:=l+3;
end; end;
procedure xuatdl; var
f:text; begin
assign(f,fo); rewrite(f); writeln(f,s1); close(f); end;
begin
(47)xuatdl; end.
Test gỵi ý:
NHIPHAN.INP NHIPHAN OUT 101111000011011100010101 11011001
101010110111000101010001110 101101001 000001111010110111010101011000 0010110110 001111000001100111010110111000 0100010110 001010100010000100001 0000000 000011110011111110101101110001 0111111110
C©u 19: D·y - DAYCON.PAS
Cho hai dãy số thực a1, a2, ,an (1) b1, b2, ,bm (2) Dãy (1) đợc gọi
dãy dãy (2) bỏ k phần tử dãy (2) ta đợc dãy (1) Ví dụ: Dãy 1, 3, dãy dãy 0,1, 2, 1, 4, 3, 5,
Yêu cầu: Với hai dãy số cho trớc, xác định xem dãy (1) có phải dãy ca dóy (2) hay khụng
Dữ liệu vào: Cho file DAYCON.INP cã cÊu tróc nh sau:
- Dòng 1: Ghi số N số lợng phần tử cđa d·y (1) (1<=N<=1000) - Dßng 2: Ghi N sè a1 a2 an, c¸c sè ghi c¸ch mét dấu cách
- Dòng 3: Ghi số M số lợng phần tử dÃy (2) (1<=M<=1000) - Dòng 4: Ghi M sè b1 b2 bm, c¸c sè ghi cách dấu cách
Dữ liệu ra: Ghi file DAYCON.OUT theo cÊu tróc nh sau:
- Dßng 1: Ghi ký tù ‘Y’ nÕu d·y (1) dÃy dÃy (2), ngợc lại ghi N VÝ dô:
DAYCON.INP DAYCON.OUT
1
0 Y
Chơng tình gợi ý:
const fi='daycon.in7'; fo='daycon.ou7';
type mmcr=array[1 1000] of real; var f:text;
a,b:mmcr; n,m:word; procedure doc; var i:word; begin
assign(f,fi); reset(f); readln(f,n);
for i:=1 to n read(f,a[i]);
readln(f);
readln(f,m);
for i:=1 to m read(f,b[i]); close(f);
end;
function tim(x:real;var j:word):word; begin
(48)end;
procedure xl;
var i,j:word; kt:char; begin
j:=1; kt:='Y';
for i:=1 to n do
begin
if (tim(a[i],j)>m) then kt:='N';
end;
assign(f,fo); rewrite(f); writeln(f,kt); close(f); end;
begin doc; xl; readln; end.
Test gỵi ý:
DAYCON.INP DAYCON OUT
4
1 4 3
1 3
N
4
1 4 4
1 4
Y
1 1 1 1
Y
1 1 1 4
N
3 1 5 5
1 7
N
5
1 9 7
1 9
Y
3 1 9 9
0 10 Y
Câu 20: Sắp xÕp x©u - STR.PAS
Cho xâu mẫu S gồm N ký tự đợc lấy từ tập ký tự ‘A’ ‘Z’ Với cặp số nguyên (i,j) (1<=i,j<=N), ta tạo xâu thứ cấp S’ cách đổi chỗ ký tự thứ i với ký tự thứ j xâu mẫu S Với M cặp số (i,j) ta thu đợc M xâu thứ cấp
(49)- Dòng 1: Ghi giá trị N, số ký tự xâu S (1<=N<=500) - Dòng 2: Ghi xâu mẫu S
- Dòng 3: Ghi giá trị M, số lợng cặp số (i, j) (1<=M<=500)
- M dòng tiếp theo: Mỗi dòng ghi cặp số i, j lần lợt số ký tự thứ i số ký tự thứ j cần đổi chỗ xâu S Hai số ghi cách dấu cách
D÷ liƯu ra: Ghi file STR.OUT theo cÊu tróc nh sau:
- M dòng: Mỗi dòng ghi xâu thứ cấp, dòng đợc tăng dần theo thứ tự từ điển
VÝ dô:
STR.INP STR.OUT
ABCDA
2 3