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 n
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO
THANH HOÁ
ĐỀ CHÍNH THỨC
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
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ả
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ữ 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
Số báo danh
……….
d r
L
Trang 2Bà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ụ:
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ụ:
) 571428 (
803 0 56
45 );
3 (
0 3
1
; 375 0 8
3
; 6 4 5
23
; 4 2
8
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
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 8 ; n 10 8 ; 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
số thập phân vô hạn tuần hoàn của phân số m n
Ví dụ:
BAI3.INP BAI3.OUT BAI3.INP BAI3.OUT
Cán bộ coi thi không giải thích gì thêm.
Hết
Trang 3-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 4assign(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 max<n then
max:=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 5n:=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.