You are on page 1of 48

program kiem_tra_nguyen_to;

var m:longint;f:text;
{------ chuong trinh con kiem tra so nguyen to ----}
function ngto(n:longint):boolean;
var i:longint;
begin
if n=2 then ngto:=false else ngto:=true;
for i:=2 to trunc(sqrt(n)) do if n mod i = 0 then
begin
ngto:=false;
break; {thoat vong lap}
end;
end;
{--- het CT con------}
{----Than chuong trinh chinh ------}
begin
{----Doc file ----}
assign(f,'nguyento.inp'); reset(f);
readln(f,m);close(f);
{----Mo file de ghi----}
assign(f,'nguyento.out'); rewrite(f);

if ngto(m) then write(f,'yes')


else write(f,'no');
close(f);
end.
****BÀI TÂP PASCAL DẠNG KHÓ
MỘT SỐ BÀI TẬP PASCAL DẠNG KHÓ

MẬT KHẨU.
Cu Tí thường xuyên tham gia thi lập trình trên mạng. Vì đạt được thành tích cao nên
Tí được gửi tặng một phần mềm diệt virus. Nhà sản xuất phần mềm cung cấp cho Tí một mã
số là một dãy gồm các bộ ba chữ số ngăn cách nhau bởi dấu chấm và có chiều dài không quá
255 (kể cả chữ số và dấu chấm). Để cài đặt được phần mềm, Tí phải nhập vào mật khẩu của
phần mềm. Mật khẩu là một số nguyên dương M được tạo ra bằng cách tính tổng giá trị các
bộ ba chữ số trong dãy mã số, các bộ ba này được đọc từ phải sang trái.

- Yêu cầu: Cho biết mã số của phần mềm, hãy tìm mật khẩu của phần mềm đó.

- Dữ liệu vào: Cho từ tệp văn bản có tên BL2.INPgồm một dòng chứa xâu ký tự S (độ
dài xâu không quá 255 ký tự) là mã số của phần mềm.

- Kết quả: Ghi ra tệp văn bản có tên BL2.OUTgồm một số nguyên là mật khẩu tìm
được.

Chương trình tham khảo:

ProgramBL2;

Constfin ='BL2.INP';

fout='BL2.OUT';

VarS:String;

i,Sum,T:Longint;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Read(f,S);

Close(f);

Sum:=0;

T:=0;

Fori:=Length(S) downto1 do

If S[i] in['0'..'9'] thenT:=T*10+(ord(S[i]) - 48)


Else

Begin

Sum:=Sum+T;

T:=0;

End;

Sum:=Sum+T;

Assign(f,fout);

ReWrite(f);

Write(f,Sum);

Close(f);

End.

var s:string;

len,sum,i:longint;

begin

readln(s);

len:=length(s);

sum:=0;

for i:=len downto 3 do

sum:=sum+((ord(s[i-2])-48)*100+(ord(s[i-1])-48)*10+(ord(s[i])-48));

writeln(sum);

end.

Trong đó, readln(s) đọc dòng dữ liệu vào cho biến s. length(s) trả về độ dài của chuỗi s.
ord(s[i]) trả về mã ASCII của ký tự tại vị trí i trong chuỗi s. Sử dụng ord(s[i])-48 để chuyển
từ ký tự sang số. Rồi cộng dồn tổng giá trị các bộ ba chữ số trong mã số để tìm được mật
khẩu. Cuối cùng, sử dụng writeln(sum) để xuất mật khẩu.

Regenerate response

Vào lúc May 31 2011, 10:23 AM, pe_kid_55 đã nói:


Bài I:Nhập số nguyên n:
1. Tính tổng các chữ số của nó.
2. Đếm số lượng chữ số 0 của n.
3. Tìm chữ số đầu tiên.
4. Tìm số có giá trị lớn nhất.
5. Đếm xem có bao nhiêu chữ số có giá trị nhỏ nhất.

Bài II:
Tìm số đảo ngược Y của một số X, biết Y gồm các chữ số của X và viết theo thứ tự ngược
lại.
Bài I: Các câu 1,2,3 có thể dùng chương trình sau:

program bai1;

uses crt;

type bignum = string;

var n:bignum;

Function tccs(n:bignum):integer;

var i,s:integer;

begin

s:=0;

for i:=1 to length(n) do

s:=s+ ord(n[i]) - 48;


tccs:=s;

end;

Function sls0(n:bignum):integer;

var i,dem:integer;

begin

dem:=0;

for i:=1 to length(n) do

if n[i]='0' then dem:=dem+1;

sls0:=dem;

end;

begin

clrscr;

writeln('nhap n: '); readln(n);

writeln('tong cac chu so la: ', tccs(n));

writeln('so luong so 0 la: ',sls0(n));

writeln('chu so dau tien la: ',ord(n[1])-48);

readln

end.

Còn 2 câu 4,5 kia thì chỉ cần tạo 2 cái Function nữa là xong, 1 Function tìm
số lớn nhất, 1 Function đếm số lượng số nhỏ nhất. Cái này bạn tự suy nghĩ
nha .

Bài II:
program bai2;

uses crt;

type bignum=string;

var n:bignum;

i:integer;

begin

clrscr;

write('nhap X: ');

readln(n);

writeln('Y la: ');

for i:=length(n) downto 1 do

write(n[i]);

readln

end.

TRÒ CHƠI VỚI BĂNG SỐ.


Trên một cuộn giấy dài, người ta lần lượt viết N số nguyên dương, giá trị mỗi

số không vượt quá 10000000.

- Yêu cầu: Hãy cắt cuộn giấy thành nhiều đoạn nhất sao cho tổng các số được

- viết trong các đoạn là bằng nhau.

- Dữ liệu vào: Cho từ tệp văn bản có tên BL3.INPcó dạng như sau:

 Dòng đầu tiên ghi số nguyên dương N(1≤N≤10000).

 Dòng thứ hai ghi N số nguyên theo thứ tự là các số được viết trên cuộn giấy, các số
nguyên cách nhau ít nhất một dấu cách.

- Kết quả: Ghi ra tệp văn bản có tên BL3.OUTgồm một dòng ghi một số nguyên là số
đoạn nhiều nhất có thể chia được.

Ví dụ:

BL3.OUT
BL3.INP
8 3

10 2 6 2 5 2 1 2
Giải thích:

+ Đoạn 1: 10

+ Đoạn 2: 2 + 6 + 2 =10

+ Đoạn 3: 5 + 2 + 1 + 2 = 10
Chương trình tham khảo:

ProgramBL3;

Constfin ='BL3.INP';

fout='BL3.OUT';

Vara:array[1..1000] ofLongint;

N,K,i,S,tong:Longint;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Readln(f,N);

Fori:=1 toN doRead(f,a[i]);

Close(f);

S:=0;

Fori:=1 toN doS:=S+a[i];

ForK:=N downto1 do

IfS modK=0 then

Begin

tong:=0;

Fori:=1 ton do

Begin

tong:=tong+a[i];
Iftong=S divK thentong:=0;

End;

Iftong=0 thenBreak;

End;

Assign(f,fout);

ReWrite(f);

Write(f,K);

Close(f);

End.

KHOẢNG CÁCH
Trong soạn thảo văn bản, theo quy ước giữa các từ chỉ nên cách nhau bằng một
khoảng cách. Tuy nhiên trên thực tế vẫn có những trường hợp ngoại lệ.

- Yêu cầu: Cho trước một xâu ký tự S chỉ gồm các chữ cái và các khoảng cách. Hãy
cho biết có nhiều nhất bao nhiêu khoảng cách đi liền nhau trong xâu S.

- Dữ liệu vào: Cho từ tệp văn bản có tên BL3.INPgồm một dòng ghi xâu S (độ dài xâu
không quá 250 ký tự).

- Kết quả: Ghi ra tệp văn bản có tên BL3.OUTgồm một số nguyên duy nhất là số
khoảng cách nhiều nhất đi liền nhau.

Chương trình tham kh ảo:

Program BL3;

Const fin ='BL3.INP';

fout='BL3.OUT';
Var S:String;

i,d,max:Integer;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Read(f,S);

Close(f);

max:=0;

d:=0;

S:=S+'a';

For i:=1 to length(S) do

If S[i]=' ' then d:=d+1

Else

Begin

If d>max then max:=d;

d:=0;

End;

Assign(f,fout);

ReWrite(f);

Write(f,max);

Close(f);
End.
DÃY TĂNG
Một dãy số a1, a2, …, anđược gọi là dãy tăng nếu như nó thỏa điều kiện: a1< a2< …
< an

- Yêu cầu: Cho dãy số nguyên a1, a2, …, an. Hãy cho biết dãy số này có phải là dãy
tăng hay không? Nếu không phải dãy tăng thì hãy cho biết chỉ số k nhỏ nhất của phần tử
làm cho dãy không có tính chất của dãy tăng.

- Dữ liệu vào: Cho từ tệp văn bản có tên BL4.INPcó dạng như sau:

 Dòng đầu tiên ghi số nguyên n(1<n≤1000)

 Dòng thứ hai ghi dãy n số nguyên a1, a2, …, an(-1000 ≤ ai≤ 1000, i=1..n)

- Kết quả: Ghi ra tệp văn bản có tên BL4.OUTgồm một số nguyên duy nhất k.

Trường hợp dãy đã cho là dãy tăng thì ghi số 0.

Chương trình tham khảo:

Program BL4;

Const fin ='BL4.INP';

fout='BL4.OUT';

Var A:Array[0..1001] of Longint;

n,i:Longint;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Readln(f,n);
For i:=1 to n do Read(f,a[i]);

Close(f);

i:=1;

While (i<=n-1) and (a[i]<a[i+1]) do i:=i+1;

Assign(f,fout);

ReWrite(f);

If i<=n-1 then Write(f,i+1)

Else Write(f,0);

Close(f);

End.

var n, i, a: integer;

flag: boolean;

begin

flag := true;

readln(n);

readln(a);

for i := 2 to n do

begin

readln(a);

if a <= a[i - 1] then

begin
flag := false;

write(i);

break;

end;

end;

if flag then write(0);

end.

Explanation:

Đọc vào số nguyên n là số phần tử của dãy.

Đọc vào mảng a chứa các phần tử của dãy.

Khởi tạo biến k = 0, nếu k = 0 sau khi duyệt mảng a, tức là dãy là dãy tăng.

Duyệt từ phần tử thứ 2 đến phần tử cuối cùng của mảng.

Nếu a[i] <= a[i - 1], cập nhật k = i và dừng duyệt.

Ghi ra tệp văn bản kết quả k.

We declare variables n, i, a, and flag to store the number of elements in the array, loop
counter, current element and flag to check if the array is increasing or not.

flag is set to true initially, meaning the array is increasing.

We read n from the input.

We read the first element of the array a[1] from the input.

In the for loop,

Regenerate response
NHỮNG SỐ NGUYÊN TỐ
Bạn Nam vừa được học về các số nguyên tố và bạn ấy rất thích vì những tính chất đặc
biệt của nó. Ngay cả trong giờ ra chơi, bạn Nam vẫn ở lại lớp và lấy giấy ra để tìm thêm
những số nguyên tố mới. Tuy nhiên, những người bạn tinh nghịch khi thấy Nam tìm ra được
một số nguyên tố thì thay đổi số đó bằng cách lấy viết ghi thêm vào sau số đó một hoặc nhiều
chữ số nữa, có lần cũng không viết thêm gì cả.

- Yêu cầu: Hãy cho biết những số nguyên tố nào có thể là số mà bạn Nam

- đã tìm được lúc đầu.

- Dữ liệu vào:Nhập từ bàn phím số nguyên dương n(20≤n≤2*1000000000000) là số


sau khi các bạn của Nam đã thay đổi.

- Kết quả ra:Xuất ra màn hình những số nguyên tố có thể là số mà bạn Nam tìm được
lúc đầu.

Ví dụ :

Nhap so nguyen duong n = 30792

Cac so nguyen to:

3079

307

Chương trình tham khảo:

ProgramBL1;

Varn,i:Longint;

Begin

Write('Nhap so nguyen duong n = ');

Readln(n);

Writeln('Cac so nguyen to:');


While n>=2 do

Begin

i:=2;

While(i<=sqrt(n)) and(n modi<>0) doi:=i+1;

Ifi>sqrt(n) thenWriteln(n);

n:=n div10;

End;

Readln;

End.
XÂU CON ĐỐI XỨNG
Một xâu ký tự gọi là đối xứng nếu viết các ký tự của xâu theo thứ tự ngược lại thì tạo
thành xâu mới giống như xâu ban đầu.

- Yêu cầu: Cho xâu ký tự S chỉ gồm các chữ cái in thường. Hãy cho biết có bao nhiêu
xâu con có nhiều hơn 1 ký tự của xâu S là đối xứng. Xâu con của xâu S là một dãy ký tự
liên tiếp trong xâu S.

- Dữ liệu vào: Cho từ tệp văn bản có tên BL2.INPgồm một dòng chứa xâu ký tự S (độ
dài xâu không quá 250 ký tự).

- Kết quả:Ghi ra tệp văn bản có tên BL2.OUTgồm một số tự nhiên là số xâu con đối
xứng của xâu S.

Chương trình tham khảo:

ProgramBL2;

Constfin ='BL2.INP';

fout='BL2.OUT';

VarS:String;
i,j,k,dem:Longint;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Read(f,S);

Close(f);

dem:=0;

Fori:=1 toLength(S)-1 do

Forj:=i+1 toLength(S) do

Begin

k:=(j-i-1) div2;

While(k>=0) and(S[i+k]=S[j-k]) dok:=k-1;

Ifk<0 thendem:=dem+1;

End;

Assign(f,fout);

ReWrite(f);

Write(f,dem);

Close(f);

End.

Algorithm:

1. Tính toán độ dài của xâu S.


2. Duyệt từng xâu con của S từ đầu đến cuối.
3. Kiểm tra mỗi xâu con có phải là xâu đối xứng hay không.
4. Nếu xâu con là xâu đối xứng và có độ dài lớn hơn 1 ký tự, tăng biến đếm số lượng
xâu con đối xứng lên 1.
5. In số lượng xâu con đối xứng ra tệp văn bản BL2.OUT.

Lời giải bằng Pascal:

var

S: string;

count, length, i, j: integer;

begin

readln(S);

length := length(S);

count := 0;

for i := 1 to length do

for j := i + 1 to length do begin

if (j - i + 1 >= 2) and (S[i] = S[j]) then begin

if checkPalindrome(S, i, j) then

inc(count);

end;

end;

writeln(count);

end;

function checkPalindrome(S: string; l, r: integer): boolean;

var
i: integer;

begin

for i := l to (l + r) div 2 do

if S[i] <> S[r - i + l] then begin

checkPalindrome := false;

exit;

end;

checkPalindrome := true;

end;

Để giải bài toán này, ta có thể sử dụng một vòng lặp để duyệt tất cả các xâu con của xâu S
và kiểm tra xem xâu con đó có phải là xâu đối xứng hay không. Nếu xâu con đó là xâu đối
xứng, ta tăng biến đếm số xâu con đối xứng lên 1.

Ví dụ, với xâu S = "abbaa", ta có các xâu con sau: "a", "b", "bb", "b", "a", "ab", "bb", "ba",
"aaa". Trong đó, chỉ có "bb" và "aaa" là xâu đối xứng.

Mã code pascal cho giải pháp này:

var

S: string;

i, j, len, count: integer;

begin

count := 0;

readln(S);

len := length(S);
for i := 1 to len do

for j := i to len do begin

if (j - i + 1 > 1) and (S[i..j] = reverse(S[i..j])) then

inc(count);

end;

writeln(count);

end.
XẾP HÀNG HÓA
Tại một bến cảng, các công nhân đang bốc dỡ các kiện hàng từ tàu biển lên các xe container.
Các kiện hàng phải được bốc dỡ lần lượt từ kiện hàng thứ nhất đến kiện hàng cuối cùng. Mỗi
kiện hàng khi bốc lên phải được đặt ngay vào xe container đang chờ sẵn để vận chuyển đi, xe
này đầy thì đến lượt xe kế tiếp. Mỗi xe container chỉ có thể chở hàng hóa có tải trọng không
quá M.

Yêu cầu:Hãy cho biết cần ít nhất bao nhiêu chuyến xe để vận chuyển hết

hàng hóa trên tàu.

Dữ liệu vào:Cho từ tệp văn bản có tên BL3.INPcó dạng như sau:

- Dòng đầu tiên ghi hai số nguyên nvà M(1≤n≤10000, 1≤M≤10000000) tương ứng là số kiện
hàng trên tàu và tải trọng tối đa của xe container.

- Dòng thứ hai ghi n số nguyên a1, a2, ..., an(1≤ai≤M) trong đó ai tương ứng là trọng lượng
của kiện hàng thứ i (i=1..n).

Kết quả: Ghi ra tệp văn bản có tên BL3.OUTgồm một dòng ghi một số nguyên là số chuyến
xe ít nhất. Các số trên cùng một dòng ghi cách nhau ít nhất một dấu cách.
Chương trình tham khảo

ProgramBL3;

Constfin ='BL3.INP';

fout='BL3.OUT';

Vara:Array[1..1000] ofLongint;

n,M,i,S,dem:Longint;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Readln(f,n,m);

Fori:=1 to n do Read(f,a[i]);

Close(f);

dem:=1;

S:=0;

Fori:=1 ton do

If S+a[i]<=M then S:=S+a[i]

Else

Begin

dem:=dem+1;

S:=a[i];

End;
Assign(f,fout);

ReWrite(f);

Write(f,dem);

Close(f);

End.
BÀI 1.(7 điểm) GIA CÔNG SẢN PHẦM

Một cơ sở sản xuất hàng thủ công mỹ nghệ vừa nhận được một đơn đặt hàng

gia công nsản phẩm. Với số lượng đặt hàng lớn như vậy, cơ sở đã huy động hết

toàn bộ công nhân bắt tay vào làm ngay. Tuy nhiên đây lại là một sản phẩm mới

nên ngày đầu tiên cơ sở chỉ làm ra được ksản phẩm. Sang ngày thứ hai, các

công nhân đã thành thạo hơn nên số sản phẩm làm ra được nhiều gấp đôi ngày

thứ nhất. Và cứ như vậy, năng suất của ngày hôm sau lại cao gấp đôi ngày hôm

trước.

Yêu cầu:Hãy cho biết cơ sở cần bao nhiêu ngày để hoàn thành hết nsản

phẩm?

Dữ liệu vào:Nhập từ bàn phím các số nguyên n, k(1≤n,k≤100000). Giả thiết

dữ liệu được nhập đúng, không cần kiểm tra.

Kết quả ra:Xuất ra màn hình số ngày hoàn thành các sản phẩm theo đơn đặt

hàng.

Ví dụ :

Nhập từ bàn phím Xuất ra màn hình

Số sản phẩm đặt hàng = 11


Số sản phẩm sản xuất trong ngày đầu tiên = 2

Số ngày hoàn thành = 3

Giải thích:

- Ngày thứ nhất làm 2 sản phẩm (còn lại 9 sản phẩm).

- Ngày thứ hai làm 4 sản phẩm (tổng cộng là 6, còn lại 5 sản phẩm).

- Ngày thứ ba có thể làm được 8 sản phẩm nhưng chỉ làm 5 sản phẩm còn lại.

BÀI 2.(6 điểm) DÃY KÝ TỰ SỐ

Bạn Nam rất yêu thích lập trình, nhất là khi gặp những bài toán khó thì bạn ấy

càng cố gắng để giải cho xong. Có một lần, trong lúc suy nghĩ về một bài toán,

tay bạn ấy lại gõ ngẫu nhiên các phím trên bàn phím, đến khi nhìn lại thì trên

màn hình đã là một dãy ký tự. Kỳ lạ thay, mặc dù là gõ ngẫu nhiên không nhìn

bàn phím nhưng có những lúc bạn ấy chỉ toàn gõ vào các phím số.

Yêu cầu:Cho xâu ký tự S là dãy các ký tự mà bạn Nam đã gõ vào, hãy cho

biết bạn Nam đã gõ liên tiếp các phím số nhiều nhất là bao nhiêu lần?

Dữ liệu vào:Cho từ tệp văn bản có tên BL2.INPgồm một dòng chứa xâu ký

tự S (độ dài xâu không quá 250 ký tự).

Kết quả:Ghi ra tệp văn bản có tên BL2.OUTcó dạng:

- Dòng đầu ghi số lần nhiều nhất mà bạn Nam gõ liên tiếp các phím số.

- Nếu có ký tự số được gõ vào thì dòng thứ hai ghi dãy các số mà bạn nam gõ

liên tiếp nhiều nhất đó. Nếu có nhiều dãy cùng có số lần gõ nhiều nhất như nhau

thì in ra dãy đầu tiên.

Ví dụ:
BL2.INP BL2.OUT

azp572gkxt8906dqsh13dj 4

8906

BÀI 3.(7 điểm) CHẠY TIẾP SỨC

Trong kỳ thi hội khỏe phù đổng cấp huyện vừa qua có n vận động viên tham

gia chạy ngắn, các vận động viên được đánh số báo danh từ 1 đến n. Kết quả

thời gian chạy của vận động viên thứ i là ti

(miligiây). Để chuẩn bị cho môn

chạy tiếp sức trong kỳ thi hội khỏe phù đổng cấp tỉnh, ban huấn luyện muốn

chọn ra 4 vận động viên chạy nhanh nhất trong số n vận động viên này.

Yêu cầu:Hãy cho biết số báo danh của 4 vận động viên được chọn. Biết rằng

không có hai vận động viên nào có cùng thành tích.

Dữ liệu vào:Cho từ tệp văn bản có tên BL3.INPcó dạng như sau:

- Dòng đầu tiên ghi số nguyên n(4≤n≤1000)

- n dòng tiếp theo, dòng thứ i ghi số nguyên dương ti

là thời gian chạy của vận

động viên thứ i ( ti

≤ 30000, i=1..n)

Kết quả:Ghi ra tệp văn bản có tên BL3.OUTgồm một dòng ghi 4 số nguyên

tương ứng là 4 số báo danh của 4 vận động viên được chọn (không cần ghi theo

thứ tự).

Các số trên cùng một dòng ghi cách nhau ít nhất một dấu cách.
Ví dụ:

BL3.INP BL3.OUT

13000

9800

10200

11500

10060

12050

11200

2357

--- HẾT ---

Lưu ý: Thí sinh không được sử dụng tài liệu. Giám thị không giải thích gì thêm.

PHÒNG GIÁO DỤC VÀ ĐÀO TẠO

HUYỆN LAI VUNG

Hướng dẫn chấm gồm 03 trang

HƯỚNG DẪN CHẤM VÀ THANG ĐIỂM

KỲ THI CHỌN HỌC SINH GIỎI LỚP 9

NĂM HỌC 2015 – 2016

MÔN: TIN HỌC

BÀI 1.(7 điểm) GIA CÔNG SẢN PHẨM

a. Thuật toán:
Dùng cấu trúc lặp tăng dần để đếm số ngày

b. Chương trình tham khảo:

ProgramBL1;

Varn,k,S,dem:Longint;

Begin

Write('So san pham dat hang = ');

Readln(n);

Write('So san pham san xuat trong ngay dau tien = ');

Readln(k);

S:=0;

dem:=0;

WhileS<n do

Begin

dem:=dem+1;

S:=S+k;

k:=k*2;

End;

Write('So ngay hoan thanh = ',dem);

Readln;

End.
c. Bộ TEST:

TEST Dữ liệu nhập Kết quả Điểm


1 n = 10

k = 20

1 1,0

2 n = 300

k = 299

2 1,0

3 n = 250

k = 250

1 1,0

4 n = 5000

k=1

13 1,0

5 n = 15700

k=5

12 1,0

6 n = 50000

k=2

15 1,0

7 n = 100000

k=3

16 1,0

BÀI 2.(6 điểm) DÃY KÝ TỰ SỐ


a. Thuật toán:

Bài toán thuộc dạng tìm từ dài nhất trong xâu

b. Chương trình tham khảo:

ProgramBL2;

Constfin = 'BL2.INP';

fout= 'BL2.OUT';

VarS:String;

i,max,dem,vitri:Integer;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Read(f,S);

Close(f);

max:=0;

dem:=0;

Fori:=1 toLength(S) do

If(S[i]>='0') and(S[i]<='9') then

Begin

dem:=dem+1;

Ifdem>max then
Begin

max:=dem;

vitri:=i;

End;

End

Elsedem:=0;

Assign(f,fout);

ReWrite(f);

Writeln(f,max);

Write(f,Copy(S,vitri-max+1,max));

Close(f);

End.
c. Bộ TEST:

TEST Dữ liệu nhập Kết quả Điểm

sjdh25jsh00491sadjh2763smdajk 5

00491

0,5

0,5

skldjl;a s';asdl'askasjdfajsj 0 1,0

3
sjdh;';7634re57834dfg57346gfh738947fkjash

3987ueirtjkdf,./l834782342907jshjlhk

12

834782342907

0,5

0,5

nb3478jdf348jgfh9038fgj348975dkj0-347dfg

83475jkfjk89-\=-aksdjh347jh000000000jksh

000000000

0,5

0,5

07304657018963457627456 23

07304657018963457627456

0,5

0,5

hjhdf346576347895hjfgsdasdjklh8930247508

3740fghjdfhgjkdhfjk5389034750834750-812

ajkgjksdf12389374508723489057346587413
67jhjk32762637ghsdgfsd7826789623457862

3478gsdgfhjsdggduyrtpy76789165789165018

6jhkjlasdggfhjasdgy576157645gfsgdfhlsgadfl

3478gwdhjsdhsa

31

123893745087234890573465874

1367

0,5

0,5

BÀI 3.(7 điểm) CHẠY TIẾP SỨC

a. Thuật toán:

Sắp xếp dãy t theo thứ tự tăng dần và chọn 4 phần tử đầu. Lưu ý khi sắp xếp lưu

lại số báo danh của vận động viên.

b. Chương trình tham khảo:


ProgramBL3;

Constfin = 'BL31.INP';

fout= 'BL31.OUT';

Vart,sbd:Array[1..1000] ofInteger;

n,i,j,tam:Integer;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Readln(f,n);

Fori:=1 ton doReadln(f,t[i]);

Close(f);

Fori:=1 ton dosbd[i]:=i;

Fori:=1 to4 do

Forj:=i+1 ton do

Ift[i]>t[j] then

Begin

tam:=t[i];

t[i]:=t[j];

t[j]:=tam;

tam:=sbd[i];

sbd[i]:=sbd[j];
sbd[j]:=tam;

End;

Assign(f,fout);

ReWrite(f);

Fori:=1 to4 doWrite(f,sbd[i],' ');

Close(f);

End.
c. Bộ TEST:Các dữ liệu nhập xem trong file BL3.INP

TEST File Input BL3.OUT Điểm

1 BL31.INP 7 10 12 14 1,0

2 BL32.INP 16 33 66 97 1,0

3 BL33.INP 67 130 178 195 1,0

4 BL34.INP 262 369 398 524 1,0

5 BL35.INP 15 358 536 598 1,0

6 BL36.INP 116 211 511 736 1,0

7 BL37.INP 83 168 713 937 1,0

---Hết---

BÀI 1.(5,0 điểm) NHỮNG ĐÓA HOA HỒNG

Tôn sư trọng đạo là một truyền thống văn hoá vô cùng tốt đẹp của dân tộc ta.

Để tỏ lòng tri ân đến quý thầy cô nhân ngày nhà giáo Việt Nam, các bạn học sinh lớp

9A dự định sẽ mua những cành hoa hồng đẹp nhất để tặng cho tất cả thầy cô trong

toàn trường. Theo tìm hiểu của bạn lớp trưởng thì nhà trường có nthầy cô giáo, do đó
các bạn cần mua ncành hoa hồng.

Tại cửa hàng bán hoa, giá của mỗi cành hoa hồng là mđồng. Tuy nhiên, cửa

hàng có chính sách giảm giá nếu khách hàng mua từ acành hoa hồng trở lên thì giá

bán sẽ giảm 25%.

Yêu cầu:Hãy tính tổng số tiền mà các bạn lớp 9A cần có để mua đủ số cành

hoa hồng như dự định.

Dữ liệu vào:Nhập từ bàn phím các giá trị n, m, a(n, m, a là các số nguyên,

1≤n≤100, 1000≤m≤10000, 5≤a≤50). Giả thiết dữ liệu được nhập đúng, không cần

kiểm tra.

Kết quả ra:Xuất ra màn hình số tiền cần có. Kết quả làm tròn đến phần

nguyên.

Ví dụ 1:

Nhập từ bàn phím Xuất ra màn hình

Số hoa cần mua = 15

Đơn giá một cành hoa hồng = 1000

Số hoa tối thiểu để được giảm giá = 20

Số tiền cần có = 15000

Ví dụ 2:

Nhập từ bàn phím Xuất ra màn hình

Số hoa cần mua = 30

Đơn giá một cành hoa hồng = 1000

Số hoa tối thiểu để được giảm giá = 10


Số tiền cần có = 22500

Giải thích: giá mỗi hoa là 1000 đồng, nhưng mua số lượng nhiều hơn 10 hoa

được giảm 25% nên giá mỗi hoa giảm còn 750 đồng

Trang 2/7

BÀI 2.(5,0 điểm) CHIA QUÀ

Trong ngày Tết Trung thu, nhà thiếu nhi đã tổ chức rước đèn trung thu cho các

em thiếu thi. Tất cả các em đều hào hứng tham gia các trò chơi của ban tổ chức. Để

động viên tinh thần các em, ban tổ chức sẽ chấm điểm ở các trò chơi để xếp hạng và

phát quà. Tuy nhiên vì là ngày vui, ban tổ chức muốn tất cả các em đều nhận được

quà, kể cả em xếp hạng cuối cùng.

Cách phát quà của ban tổ chức như sau: em xếp hạng cuối cùng sẽ được 1 gói

quà, em xếp hạng kế trên em cuối cùng được 4 gói quà,…Nói chung, em xếp hạng

cao sẽ có số gói quà nhiều hơn bạn xếp hạng liền sau mình 3 gói quà. Biết rằng có n

em tham gia rước đèn trung thu và khi tổng kết điểm thì không có hai em nào có cùng

số điểm.

Yêu cầu:Hãy cho biết ban tổ chức cần chuẩn bị bao nhiêu gói quà để phát

trong đêm Trung thu nếu số lượng em thiếu nhi tham gia đã được biết trước?

Dữ liệu vào:Nhập từ bàn phím số nguyên dương n là số em thiếu nhi tham gia

rước đèn trung thu (1≤n≤1000).

Kết quả ra:Xuất ra màn hình số gói quà mà ban tổ chức cần chuẩn bị.

Ví dụ:

Nhập từ bàn phím Xuất ra màn hình


Số em thiếu nhi = 5 Số gói quà chuẩn bị = 35

Giải thích: Số quà từng em nhận được lần lượt là: 1, 4, 7, 10, 13

BÀI 3.(5,0 điểm) CHUỖI NGỌC

Dọc theo con đường tơ lụa, những con lạc đà cần mẫn chuyên chở tơ lụa,

hương liệu và ngọc ngà đá quý của Phương Đông. Đá quý được phân thành 26 loại

ký hiệu bằng chữ cái la tinh thường từ a đến z. Các lái buôn muốn bán được hàng với

giá càng cao càng tốt. Trong chuyến đi này một lái buôn mang theo bộ đá quý gồm n

viên (1 ≤ n≤ 250). Ông xâu tất cả thành chuỗi và bày ra trên thảm trước một lãnh

chúa hùng mạnh. Vị lãnh chúa cân nhắc đánh giá chất lượng bộ đá quý để quyết định

có nên mua hay không. Theo quy tắc truyền thống của địa phương, giá trị của chuỗi

ngọc phụ thuộc vào sự xuất hiện các cặp ngọc (ai

, bi

), tức là phải có ngọc loại ai

đi

trước loại bi(i= 1..k, 1 ≤ k≤ 676). Nếu giá trị chuỗi ngọc đủ lớn, lãnh chúa sẽ mua

toàn bộ chuỗi ngọc.

Yêu cầu:Cho biết số viên ngọc n, xâu Sthể hiện các loại ngọc trong chuỗi và

cách định giá trị chuỗi ngọc của địa phương. Hãy xác định giá trị của chuỗi ngọc.

Dữ liệu vào:Cho từ tệp văn bản có tên BL3.INPcó dạng như sau:

- Dòng đầu tiên ghi hai số nguyên nvà k.

- Dòng thứ hai chứa xâu S.

- Tiếp theo là k dòng, mỗi dòng chứa hai ký tự xác định cặp giá trị.
Kết quả:Ghi ra tệp văn bản có tên BL3.OUTgồm một số nguyên duy nhất là

giá trị của chuỗi ngọc.

Trang 3/7

Ví dụ:

BL3.INP BL3.OUT

73

abacaba

ab

ac

bb

Giải thích:

- Dòng thứ ba là cách thứ nhất xác định cặp giá trị: ngọc loại a đứng trước ngọc

loại b. Với cách này thì có 4cặp (xem hình bên).

- Dòng thứ tư là cách thứ hai xác định cặp giá trị: ngọc loại a đứng trước ngọc

loại c. Với cách này thì có 2cặp.

- Dòng thứ năm là cách thứ ba xác định cặp giá trị: ngọc loại b đứng trước

ngọc loại b. Với cách này thì có 1cặp.

BÀI 4.(5,0 điểm) TỔNG LỚN NHẤT

Tranh thủ trong giờ ra chơi, hai bạn Nam và Bình rủ nhau chơi trò tìm số. Hai

bạn lần lượt mỗi người viết một số nguyên lên bảng, Nam viết số thứ nhất, Bình viết

số thứ hai, rồi đến lượt Nam viết số thứ ba,… Cứ tiếp tục như vậy hai bạn viết được
một dãy gồm nsố a1, a2, …, an. Đến đây hai bạn chưa kịp chơi trò chơi của mình thì

đã đến giờ học. Thầy vào lớp, sẳn thấy dãy số trên bảng, thầy đã đặt ra câu đố: Tìm

một đoạn liên tiếp các số trong dãy số trên sao cho tổng giá trị các số trong đoạn đó là

lớn nhất. Vì dãy số có quá nhiều số nên cả lớp nhìn hoa cả mắt mà vẫn chưa tìm ra

được đáp án. Bạn hãy lập trình giải giúp các bạn trong lớp nhé.

Dữ liệu vào:Cho từ tệp văn bản có tên BL4.INPcó dạng như sau:

- Dòng đầu tiên ghi số nguyên n(1≤n≤1000)

- Dòng thứ hai ghi dãy n số nguyên a1, a2, …, an(-1000 ≤ ai

≤ 1000, i=1..n)

Kết quả:Ghi ra tệp văn bản có tên BL4.OUTgồm một số nguyên duy nhất là

tổng lớn nhất của một đoạn liên tiếp các số trong dãy.

Ví dụ:

BL4.INP BL4.OUT

10

2 -9 4 1 -3 5 8-7 3 1

15

--- HẾT ---

Họ và tên thí sinh: .......................................... Số báo danh: ..............................

Chữ ký của giám thị 1: ...................... Chữ ký của giám thị 2: ............................

Lưu ý: Thí sinh không được sử dụng tài liệu. Giám thị không giải thích gì thêm.

abacaba

abacaba
a b a c a b a

Trang 4/7

PHÒNG GIÁO DỤC VÀ ĐÀO TẠO

HUYỆN LAI VUNG

HƯỚNG DẪN CHẤM VÀ THANG ĐIỂM

KỲ THI CHỌN HỌC SINH GIỎI LỚP 9

NĂM HỌC 2014 – 2015

MÔN: TIN HỌC

BÀI 1.(5 điểm) NHỮNG ĐÓA HOA HỒNG

a. Thuật toán:

Kiểm tra nếu số hoa cần mua nhỏ hơn số hoa tối thiểu để được giảm giá thì số tiền =

số hoa * đơn giá; ngược lại thì số tiền = số hoa * đơn giá * 0.75

b. Chương trình tham khảo:

ProgramBL1;

Varn,m,a:Longint;

Begin

Write('So hoa can mua = ');

Readln(n);

Write('Don gia mot canh hoa = ');

Readln(m);

Write('So hoa toi thieu de duoc giam gia = ');


Readln(a);

Ifn<a then

Write('So tien can co = ',n*m)

Else

Write('So tien can co = ',n*m*0.75 :8:0);

Readln;

End.
c. Bộ TEST:

TEST Dữ liệu nhập Kết quả Điểm

1 n = 20

m = 5000

a = 30

100000 1,0

2 n = 25

m = 1200

a = 50

30000 1,0

3 n = 15

m = 1800

a=5

20250 1,0

4 n = 27
m = 1200

a = 27

24300 1,0

5 n = 100

m = 10000

a = 30

750000 1,0

Trang 5/7

BÀI 2.(5 điểm) CHIA QUÀ

a. Thuật toán:

Đây là bài toán tính tổng n phần tử đầu tiên của cấp số cộng có công sai d=3. Cũng

có thể áp dụng lệnh For để tính.

b. Chương trình tham khảo:

ProgramBL2;

Varn,i,a,S:Longint;

Begin

Write('So em thieu nhi = ');

Readln(n);

S:=1; a:=1;

Fori:=2 ton do

Begin
a:=a+3;

S:=S+a;

End;

Write('So goi qua chuan bi = ',S);

Readln;

End.
c. Bộ TEST:

TEST Dữ liệu nhập Kết quả Điểm

1 10 145 1,0

2 245 89915 1,0

3 679 691222 1,0

4 853 1090987 1,0

5 1000 1499500 1,0

BÀI 3.(5 điểm) CHUỖI NGỌC

a. Thuật toán:

Với mỗi cặp vị trí i và j (i<j) trong xâu chuỗi, ta kiểm tra xem cặp ký tự Si, S

có nằm

trong số k cặp giá trị hay không. Để giảm thời gian kiểm tra, ta dùng một mảng hai chiều

A[‘a’..’z’, ‘a’..’z’] để đánh dấu các cặp giá trị.

b. Chương trình tham khảo:


ProgramBL3;

Constfin ='BL3.INP';

fout='BL3.OUT';

VarA:Array['a'..'z','a'..'z'] ofInteger;

S:String;

c1,c2:Char;

n,k,i,j,d:Longint;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Readln(f,n,k);

Readln(f,S);

Trang 6/7

Fori:=1 tok do

Begin

Readln(f,c1,c2);

A[c1,c2]:=1;

End;

Close(f);

n:=Length(S);

d:=0;
Fori:=1 ton-1 do

Forj:=i+1 ton dod:=d + A[s[i],s[j]];

Assign(f,fout);

ReWrite(f);

Write(f,d);

Close(f);

End.
c. Bộ TEST:Các dữ liệu nhập xem trong file BL31.INP

TEST File Input BL3.OUT Điểm

1 BL31.INP 13 1,0

2 BL32.INP 52 1,0

3 BL33.INP 159 1,0

4 BL34.INP 1730 1,0

5 BL35.INP 13785 1,0

BÀI 4.(5 điểm) TỔNG LỚN NHẤT

a. Thuật toán:

Mỗi đoạn con được xác định bởi vị trí phần tử bắt đầu đoạn và vị trí phần tử cuối

đoạn. Với mỗi đoạn con, ta tính tổng các phần tử của đoạn rồi so sánh chọn ra tổng lớn nhất.

Gọi Sk= a1+ a2+ … ak(k=1..n)

Khi đó ta có ai+ ai+1+ … + aj= Sj– Si-1(ở đây ta khởi tạo S0=0)

Theo cách này ta không cần lưu lại mảng a.

b. Chương trình tham khảo:


ProgramBL4;

Constfin ='BL4.INP';

fout='BL4.OUT';

VarS:Array[0..1000] ofLongint;

n,x,i,j,max:Longint;

f:Text;

Begin

Assign(f,fin);

Reset(f);

Readln(f,n);

S[0]:=0;

Fori:=1 ton do

Begin

Read(f,x);

S[i]:=S[i-1] + x;

End;

Close(f);

Trang 7/7

max:=S[1];

Fori:=1 ton do

Forj:=i ton do

Ifmax < S[j]-S[i-1] thenmax:=S[j] - S[i-1];


Assign(f,fout);

ReWrite(f);

Write(f,max);

Close(f);

End.
c. Bộ TEST:Các dữ liệu nhập xem trong file

TEST File Input BL4.OUT Điểm

1 BL41.INP 9 1,0

2 BL42.INP 909 1,0

3 BL43.INP 2327 1,0

4 BL44.INP 3523 1,0

5 BL45.INP 7893 1,0

---Hết---

KỲ THI HỌC SINH GIỎI LỚP 9 CẤP HUYỆN


UBND HUYỆN QUẾ SƠN
NĂM HỌC 2011-2012
PHÒNG
GD&ĐT Môn: Tin học - Lớp 9

Thời gian làm bài: 150 phút (Không kể thời gian giao đề)

ĐỀ CHÍNH THỨC - VÒNG I

Bài 1 (2,0 điểm):


Tam giác vuông ABC (Â=900) có AH là đường cao. Viết chương trình
cho phép nhập BH và CH từ bàn phím rồi thực hiện:

a. Tính cạnh AB của tam giác.

b. Tính diện tích tam giác ABC.

Ví dụ:

Dữ liệu ra
Dữ liệu vào
Nhap BH: 2 AB = 2.83

Nhap CH: 2 Dien tich tam giac ABC: 4.00


Nhap BH: 0 Nhap BH: (Yêu cầu nhập lại BH >0)

Nhap CH: 2

Bài 2(3,0 điểm):

Viết chương trình cho phép nhập một dãy gồm n số nguyên (Số n và các
phần tử của dãy được nhập từ bàn phím). Thực hiện:

a. Cho biết giá trị lớn nhất của dãy.

b. In ra các phần tử của dãy là số chính phương.

c. Dãy đan dấu là dãy có tính chất: không có hai phần tử cạnh nhau có
dấu giống nhau. Cho biết dãy vừa nhập (không chứa phần tử 0) có đan
dấu không?

Ví dụ:

Dữ liệu ra
Dữ liệu vào
Nhap so phan tu: 4 Gia tri lon nhat: 3

Nhap day: -4; 3; -2; 1 Cac phan tu chinh phuong la: 1


Day dan dau
Nhap so phan tu: 5 Gia tri lon nhat: 5

Nhap day: -4; 3; 2; -1; 5 Cac phan tu chinh phuong la:

Day khong dan dau

Bài 3(3,0 điểm):

Viết chương trình cho phép nhập số nguyên dương N rồi thực hiện:

a. In ra tất cả các ước số nguyên dương của N.

b. In ra số ước số nguyên dương của số N

c. In ra số M nhỏ nhất thỏa: 0 < M  N có nhiều ước số nguyên dương


nhất.

Ví dụ:

Dữ liệu ra
Dữ liệu vào
Nhap so N: 10 Cac uoc cua N la: 1; 2; 5; 10

So uoc cua N la: 4.

So M la: 6
Nhap so N: 30 Cac uoc cua N la: 1; 2; 3; 5; 6; 10; 15;
30

So uoc cua N la: 8

So M là: 24
Nhap so N: 0 Nhap so N: (Yêu cầu nhập lại số N)

Bài 4 (2,0 điểm):


Xét các chữ số từ 0 đến 9. Nếu chữ số có một đường khép kín thì ta gọi
chữ số đó có 1 lỗ hổng, có hai đường khép kín thì ta gọi số đó có 2 lỗ hổng, và
không có đường khép kín nào thì ta gọi chữ số đó có 0 lỗ hổng. Vậy các chữ số
0, 4, 6, 9 có 1 lỗ hổng, chữ số 8 có 2 lỗ hổng và các chữ số 1, 2, 3, 5, 7 có 0 lỗ
hổng. Số lỗ hổng của một số tự nhiên N là tổng số lỗ hổng của các chữ số của
nó.
Hãy viết chương trình cho phép đếm số lỗ hổng của một số tự nhiên N (0
≤ N ≤ 2147483647).

Ví dụ:

Dữ liệu ra
Dữ liệu vào
Nhap N: 388247 So lo hong la: 5
Nhap N: 0 So lo hong la: 1
Nhap N: 123 So lo hong la: 0

==HẾT==

You might also like