1. Trang chủ
  2. » Giáo Dục - Đào Tạo

tai lieu boi duong tin

49 18 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

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

Ngày đăng: 20/05/2021, 07:15

Xem thêm:

TỪ KHÓA LIÊN QUAN

w