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

Đề + 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

5 4,3K 141

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 89,5 KB
File đính kèm Loi giai + chuong trinh + botest.rar (1 MB)

Nội dung

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 1

SỞ 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 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ụ:

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 4

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 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 5

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.

Ngày đăng: 23/01/2016, 05:09

TỪ KHÓA LIÊN QUAN

w