Tải bản đầy đủ (.doc) (5 trang)

Đề + thuật toán + chương trình giải đề thi HSG tỉnh thanh hóa năm 2014 2015 môn tin học

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

SỞ GIÁO DỤC VÀ ĐÀO TẠO
THANH HOÁ

KỲ THI HỌC SINH GIỎI TỈNH
Năm học: 2014-2015
Môn thi: Tin học
Lớp 12 THPT
Ngày thi: 24/03/2015
Thời gian: 180 phút (không kể thời gian giao đề)
Đề này có 03 bài, gồm 02 trang.

ĐỀ CHÍNH THỨC
Số báo danh
…………………….

Tổng quan bài thi:
Tên bài

File chương trình

File dữ liệu vào

File kết quả

Bài 1

DÂY XÍCH

BAI1.PAS

BAI1.INP



BAI1.OUT

Bài 2

TÌM MẬT KHẨU

BAI2.PAS

BAI2.INP

BAI2.OUT

Bài 3

BIỂU DIỄN PHÂN SỐ

BAI3.PAS

BAI3.INP

BAI3.OUT

Dữ liệu vào là đúng đắn, không cần phải kiểm tra. Các số trên một dòng ghi cách nhau một dấu cách.

Hãy lập trình giải các bài toán sau:
Bài 1: (6 điểm) DÂY XÍCH
Người ta dùng dây thép tròn có đường kính thiết diện ngang là d làm n vòng tròn,
bán kính vòng tròn trong là r, móc nối với nhau thành một dây xích, mỗi vòng tròn là
một mắt xích. Nếu dây xích có nhiều hơn một mắt xích thì tồn tại hai vòng tròn mà mỗi

vòng chỉ nối với đúng với một vòng tròn khác, đó là các mắt xích đầu và cuối. Cầm 2
mắt xích đầu và cuối, kéo căng ra, ta có dây xích độ dài L.
Yêu cầu: Cho d, r và n. Hãy tính độ dài L của dây xích.
d

r

L
Dữ liệu vào: Vào từ file văn bản BAI1.INP gồm một dòng chứa 3 số nguyên dương d,
r và n (d < r ≤ 100; n ≤ 109).
Kết quả: Ghi ra file văn bản BAI1.OUT một số nguyên là độ dài L tìm được.
Ví dụ:
BAI1.INP BAI1.OUT
2 10 3
64

Trang 1/2


Bài 2: (7 điểm) TÌM MẬT KHẨU:
Việc bảo vệ máy tính của mình để hạn chế người khác thâm nhập vào là một vấn
đề đặt ra cho mọi người sử dụng máy tính. Để tăng tính an toàn trong lưu trữ Lan đã
quyết định đặt mật khẩu truy cập máy tính của mình vào một xâu T với một quy ước
sao cho khi cần cô ta có thể lấy lại được mật khẩu từ xâu T như sau:
Là một người yêu thích số học cô ta thường chọn mật khẩu P là một số nguyên tố
và đem giấu vào trong một xâu ký tự T sao cho P chính là số nguyên tố có giá trị lớn
nhất trong số các số nguyên tố được tạo từ các xâu con của T (xâu con của một xâu ký
tự T là một chuỗi liên tiếp các ký tự trong T).
Ví dụ: xâu T= “Test1234#password5426” chứa mật khẩu là 23 vì T chứa các xâu
con ứng với các số nguyên tố 2, 3, 23 và 5.

Yêu cầu: cho một xâu ký tự T có chiều dài không quá 500 ký tự. Tìm mật khẩu P đã
dấu trong xâu T biết P có giá trị nhỏ hơn 105. Dữ liệu cho đảm bảo luôn có P.
Dữ liệu vào: vào từ file văn bản BAI2.INP gồm 1 dòng duy nhất là xâu T.
Kết quả: ghi ra file văn bản BAI2.OUT là số P tìm được.
Ví dụ:
BAI2.INP
BAI2.OUT
Test1234#password5426 23
Bài 3: (7 điểm) BIỂU DIỄN PHÂN SỐ
Một phân số luôn luôn có thể được viết dưới dạng số nguyên hoặc số thập phân
hữu hạn hoặc số thập phân vô hạn tuần hoàn.
Ví dụ:
8
−23
−3
1
−45
= 4;
= −4.6;
= 0.375; = 0.(3);
= −0.803(571428)
2
5
−8
3
56

Trong các ví dụ trên thì các chữ số đặt trong dấu ngoặc chỉ phần tuần hoàn của số
thập phân.
8

8
Dữ liệu vào: vào từ file văn bản BAI3.INP gồm 2 số nguyên m và n ( m ≤ 10 ; n ≤ 10 ; n ≠ 0 ).
Kết quả: ghi ra file văn bản BAI3.OUT là số nguyên hoặc số thập phân hữu hạn hoặc
m
số thập phân vô hạn tuần hoàn của phân số .
n
Ví dụ:
BAI3.INP BAI3.OUT BAI3.INP
BAI3.OUT
8 2
4
−45 56
−0.803(571428)
Cán bộ coi thi không giải thích gì thêm.
----------------------------- Hết -----------------------------

Trang 2/2


HƯỚNG DẪN LÀM
Bài 1: (6 điểm) DÂY XÍCH
Ta thấy ngoại trừ thiết diện đầu tiên và thiết diện cuối cùng ra thì các thiết diện ở
giữa đều nằm trong một hình tròn nào đó. Vì vậy khi tính chiều dài ta không tính các
thiết diện ở giữa. Do đó, công thức tính chiều dài là: L := 2*r*n + 2*d
var l:qword;
n:qword;
d,r:byte;
f:text;
begin
assign(f,'BAI1.INP');

reset(f);
read(f,d,r,n);
close(f);
l:=2*d+r*2*n;
assign(f,'BAI1.OUT');
rewrite(f);
write(f,l);
close(f);
end.

Bài 2: (7 điểm) TÌM MẬT KHẨU:
- Vì xâu T có không quá 500 kí tự nên ta phải dùng kiểu Ansistring thay cho kiểu string
- Mật khẩu nhỏ hơn 105 nên ta chỉ xét những xâu có độ dài bé hơn 8
- Dựa vào thủ tục VAL trong pascal để biết xâu có phải chỉ có mình chữ số hay không?
Nếu khi dùng VAL(s,n,code) mà code=0 thì xâu S chỉ có chữ số (vì quá chỉnh đổi xâu
thành số thành công).
- Mật khẩu là số nguyên tố nên ta viết hàm kiểm tra tính nguyên tố
- Từ những nhận xét trên ta có thể viết chương trình cho bài toán
const fi='Bai2.inp';
fo='Bai2.out';
var f:text;
s:ansistring;
l,max,code,i,n,j:longint;
{===============================}
function NTO(n:longint):boolean;
var i:longint;
begin
if n<2 then
NTO:=false
else

begin
i:=2;
while i*i<=n do
if n mod i=0 then
break
else
i:=i+1;
NTO:=i*i>n;
end;
end;
{============================}

Trang 3/2


BEGIN
assign(f,fi);
reset(f);
readln(f,s);
close(f);
l:=length(s);
max:=0;
for i:=1 to l do
for j:=i to l do
if j-i<6 then
begin
val(copy(s,i,j-i+1),n,code);
if (code=0) and (n<100000) and NTO(n) then
if maxmax:=n;

end;
assign(f,fo);
rewrite(f);
write(f,max);
close(f);
END.

Bài 3: (7 điểm) BIỂU DIỄN PHÂN SỐ
- Chú ý xét dấu kết quả:
Nếu 2 số đều âm hoặc 2 số đều dương thì kết quả là một số dương; ngược lại kết
quả là một số âm
- Nếu m chia hết cho n thì kết quả là m div n (không có phần thập phân).
- Nếu m không chia hết cho n:
Kết quả gồm phần nguyên là m div n và dấu chấm + phần thập phân
Phần thập phân được xác định như sau:
Ta cứ lấy phần dư nhân * 10 DIV mẫu số cho đến khi phần dư bằng không hoặc
lặp lại giá trị phần dư. Để biết phần dư sinh ra có lặp lại hay không ta dùng một mảng
để đánh dấu những phần dư đã có.
const fi='Bai3.inp';
fo='Bai3.out';
var f:text;
i,j,k,du,m,n:longint;
cc,b,a:array[1..100000000] of longint;
begin
assign(f,fi);
reset(f);
readln(f,m,n);
close(f);
assign(f,fo);
rewrite(f);

if ((n>0) and (m<0)) OR ((n<0) and (m>0)) then
write(f,'-');
m:=abs(m);
n:=abs(n);
if m mod n=0 then
write(f,m div n)
else
begin
write(f,m div n,'.');
m:=abs(m);

Trang 4/2


n:=abs(n);
du:=m mod n;
k:=0;
while (du>0) and (cc[du]=0) do
begin
cc[du]:=1;
inc(k);
b[k]:=du;
m:=du*10;
a[k]:=m div n;
du:=m mod n;
end;
if du=0 then
begin
for i:=1 to k do
write(f,a[i]);

end
else
begin
for i:=1 to k do
if b[i]=du then
break;
for j:=1 to i-1 do
write(f,a[j]);
write(f,'(');
for j:=i to k do
write(f,a[j]);
write(f,')');
end;
end;
close(f);
end.

Trang 5/2



×