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

bài tập ôn học sinh giỏi tin từ dễ đến khó có lời giải

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 (236.65 KB, 45 trang )

Bài 1: Tệp ‘so.inp’ gồm 1 dãy sô nguyên, mỗi số cách nhau bằng 1 dấu cách, mỗi số có giá
trị tuyệt đối khơng vượt q 1000. Viết chương trình kiểm tra xem trong dãy đó số nào
là số nguyên tố và đưa kết quả ra tệp ‘so.out’
VD: Tệp ‘so.inp’:
1 9 7 3 -6

Tệp ‘so.out’:

73

Chương trình
Var t1, t2 : text;
i: longint;
function nt(n:longint):boolean;
var i:longint;
begin
nt:=true;
if n<2 then begin nt:=false; exit; end;
if (n=2) or (n=3) then exit;
if (n mod 2=0) or (n mod 3 =0) then begin nt:=false;exit; end;
i:=5;
while i<= trunc(sqrt(n)) do
begin
if (n mod i=0) or (n mod (i+2)=0) then
begin nt:= false; exit; end;
i:=i+6;
end;
end;
begin
assign (t1,'tep1.inp'); assign(t2,'tep2.out');
reset(t1);rewrite(t2);




while not eof (t1) do
begin
read(t1,i);
if nt(i) then write(t2,i,' ');
end;
close(t1); close(t2);
end.
Bài 2: Tính tổng các chữ số của số nguyên:
- tệp b2.inp chứa một dãy số nguyên dương (không quá 50 số), mỗi số phân cách nhau
bởi 1 kí tự cách,giá trị mỗi số không vượt quá 60000
- Tệp b2.out chứa tổng các chữ của mỗi số nguyên trong dãy
VD:

1200 35000 7289

3 8 26

{bài 2}
var n: word;
f1,f2: text;
function tongcs(n:word):byte;
var s:byte;
begin
s:=0;
while n <> 0 do begin
s:= s+n mod 10;
n:=n div 10;
end;

tongcs:=s;


end;
begin
assign(f1,'b2.inp'); reset(f1);
assign(f2,'b2.out'); rewrite(f2);
while not eof(f1) do
begin
read(f1,n);
write(f2,tongcs(n),' ')
end;
close(f1); close(f2);
end.
Bài 3: Tìm ưcln của 2 số nguyên nhập từ bàn phím.
- tệp b3.inp chứa 2 số nguyên trên cùng một dòng.
- tệp b3.out chứa ucln của 2 số.
VD:
B3.inp
36 24
{bài 3}
var m,n: Longint;
f1,f2: text;
function UCLN(a,b: longint): longint;
var r : longint;
begin
while b<>0 do begin
r := a mod b;
a := b;
b := r;

end;
UCLN := a;
end;
begin

B3.out
12


assign(f1,'b3.inp'); reset(f1);
assign(f2,'b3.out'); rewrite(f2);
read(f1,m,n);
write(f2,ucln(m,n));
close(f1); close(f2);
end.
Bài 4: Viết ct kiểm tra xem 2 số nguyên có phải là số nguyên tố cùng nhau hay không. ( 2
số nguyên được gọi là nt cùng nhau nếu có ucln =1)
- Tệp ‘b4.inp’ gồm 2 số nguyên, tệp ‘b4.out’ chứa kết quả: nếu là snt cùng nhau thì
ghi là “dung”, nếu khơng phải thi ghi là “sai”
VD: b4.inp:

B4.out:

29

dung

{Bài 4}
var m,n: integer;
f1,f2: text;

function UCLN(a,b: integer): integer;
var r : integer;
begin
while b<>0 do begin
r := a mod b;
a := b;
b := r;
end;
UCLN := a;
end;
begin


assign(f1,'b4.inp'); reset(f1);
assign(f2,'b4.out'); rewrite(f2);
read(f1,m,n);
if ucln(m,n)=1 then write(f2,'dung') else write(f2,'sai');
close(f1); close(f2);
end.
Bai 5: Nhập dãy số thực a, tính tổng a1 - a2+a3-a4+...an
Dữ liệu vào từ Tep.inp gồm 2 dòng:
- Dòng 1 chứa số nguyên n
- Dòng 2 là dãy số thực gồm n số hạng.
Dữ liệu ra là Tệp.out là giá trị tổng.
VD:
Tep.inp
3
457
{bai 5}
var f1,f2:text;

a: real;
i,n,d: integer;
s: real;
begin
assign(f1,'tep.inp'); reset(f1);
assign(f2,'tep.out'); rewrite(f2);
readln(f1,n);
s:=0;
for i:= 1 to n do
begin
read(f1,a);
if i mod 2 <>0 then s:= s+ a else s:=s-a;
end;
write(f2,s:6:2);
close(f1); close(f2);

Tep.out
6


end.
Bài 6: Tìm UCLN của n số nguyên dương:
- Tệp b6.inp gồm 2 dòng: Dòng đầu tiên chứa số nguyên dương n <=1000, dòng thứ 2
chứa n số nguyên dương (mỗi số <=1010).
- Tệp b6.out chứa 1 số nguyên là UCLN của n số nguyên từ tệp b6.inp
VD:
B6.inp
3

B6.out

4

12 36 8
{bai 6}
var a: array[1..20] of integer;
i,n: byte;
u:integer;
fi,fo:text;
function UCLN(a,b: integer): integer;
var r : integer;
begin
while b<>0 do begin
r := a mod b;
a := b;
b := r;
end;
UCLN := a;
end;
begin
assign(fi,'b6.inp'); reset(fi);
assign(fo,'b6.out'); rewrite(fo);
readln(fi,n);
read(fi,a[1]);


u:=a[1];
for i:=2 to n do begin
read(fi,a[i]);
u:=ucln(u,a[i]);
end;

write(fo,u);
close(fi); close(fo);
end.
Bài 7: Tìm xem trong các sơ ngun từ 1 đến n có bao nhiêu số hoàn thiện (số hoàn thiện
là số nguyên dương có tổng các ước số nguyên dương bé hơn nó bằng chính nó)
- tệp b7.inp chứa số ngun dương n
- tệp b7.out chứa tất cả các số hồn thiện tìm được trên cùng một dòng
VD:
B7.inp
30
{bài 7}
var n,i: word;
f1,f2: text;
function tongus(n : integer): integer;
var i,s : integer;
begin
s := 0;
for i := 1 to n div 2 do
if n mod i = 0 then s := s + i;
tongus := s;
end;
begin
assign(f1,'b7.inp'); reset(f1);
assign(f2,'b7.out'); rewrite(f2);

B7.out
6 28


read(f1,n);

for i:=1 to n do
if tongus(i)=i then write(f2,i,' ');
close(f1); close(f2);
end.
Bài 8: cho 2 phan so a/b va c/d. hay xac dinh 2 so nguyen duong e va f thoa man e/f=a*c/
(b*d) (e/f la phan so da toi gian).
Dữ liệu vào là tệp nhan.inp: Dòng 1 chứa 2 số a và b, dòng 2 chứa 2 số c và d (a, b, c, d là
các số nguyên dương không lớn hơn 10000)
Dữ liệu ra là tệp nhân.out chứa 2 số e và f trên cùng một dòng
VD:
Nhan.inp
56

Nhan.out
53

84
{bai 8}
var a,b,c,d: longint;
x,y,e,f:longint;
f1,f2: text;
function UCLN(a,b: longint): longint;
var r : integer;
begin
while b<>0 do begin
r := a mod b;
a := b;
b := r;
end;
UCLN := a;

end;
begin
assign(f1,'nhan.inp'); reset(f1);
assign(f2,'nhan.out'); rewrite(f2);


readln(f1,a,b);readln(f1,c,d);
x:= a*c; y:= b*d;
e:=x div ucln(x,y); f:=y div ucln(x,y);
write(f2,e, ' ',f);
close(f1); close(f2);
end.
Bài 9: Giai thừa của một số được cho bởi công thức sau: n!=1*2*…*n
Cho số N (N<=2.109) nguyên dương, tính tổng giai thừa các chữ số của nó.
- Tệp b9.inp chứa số nguyên N
- Tệp b9.out chứa giá trị của tổng giai thừa
(ví dụ n=24 thì 2!= 1*2=2; 4! =1*2*3*4= 24 ; vậy out put = 2+24 =26)
VD:
B9.inp
24

B9.out
26

{bai9}
var SUM,n,x:longint;
f1,f2:text;
function GT(a:integer):longint;
var i:integer; t:longint;
begin

if a=0 then T:=1
else
begin
T:=1;
for i:=1 to a do
T:=T*i;
end;
GT:=T;
end;
begin


assign(f1,'b9.inp'); reset(f1);
assign(f2,'b9.out'); rewrite(f2);
read(f1,n);
sum:=0;
while n>0 do
begin
x:=n mod 10;
SUM:=SUM+GT(x);
n:=n div 10;
end;
write(f2,sum);
close(f1); close(f2);
end.
(Hướng dẫn) Trong bài các em viết 1 hàm tính giai thừa của số nguyên dương N. Sử
dụng hàm này để tính tổng các chữ số của một số.
Bai 10: cho 1 day so nguyen, dua ra day so nguyen moi sao cho vi tri cac so trong moi so
nguyen bi dao nguoc.
-inp: 1 dong la day so nguyen

- output: day so da bi dao
VD:
input
10 34 56
{bai 10}
Program Dao_so;
Var
M,sd:LongInt;
i,k: integer;
f1,f2:text;
(*-------------------*)
BEGIN
assign(f1,'So.INP'); reset(f1);

Output
01 43 65 0


assign(f2,'So.OUT'); rewrite(f2);
while not eof(f1) do
Begin
read(f1,m);
while m<>0 do
begin
sd:=m mod 10;
write(f2,sd);
m:=m Div 10;
end;
write(f2,' ')
end;

close(f1);
close(f2);
END.
Bài 11
Kiểm tra 1 số có phải là số nguyên tố mạnh hay không. Số nguyên tố mạnh là số nguyên
tố lớn hơn trung bình cộng của số nguyên tố liền trước và số nguyên tố liền sau nó. (ví dụ
11 là số ngun tố mạnh vì 11 > (7 +13)/2; 7 khơng phải mạnh vì 7 <(5+11)/2)
- Tệp inp gồm nhiều dịng, dịng đầu tiên chứa sơ ngun n (n<=100), n dịng tiếp
theo mỗi dịng chứa 1 sơ nguyên (0<=n<10000)
- Tệp out gồm n dòng, nếu là snt mạnh thì ghi true, ngược lại thì ghi False
VD:
inp
2

Out
True

11

False

7
{bai11}
var j,n,x,i,k:longint;
f1,f2:text;


function nt(n:longint):boolean;
var i:longint;
begin

nt:=true;
if n<2 then begin nt:=false; exit; end;
if (n=2) or (n=3) then exit;
if (n mod 2=0) or (n mod 3 =0) then begin nt:=false;exit; end;
i:=5;
while i<= trunc(sqrt(n)) do
begin
if (n mod i=0) or (n mod (i+2)=0) then
begin nt:= false; exit; end;
i:=i+6;
end;
end;
Begin
assign(f1,'b11.inp'); reset(f1);
assign(f2,'b11.out'); rewrite(f2);
readln(f1,n);
for k:=1 to n do
begin
readln(f1,x);
if (nt(x)=false) or (x<4) then writeln(f2,'false')
else
begin
i:=x-2;
while (i>0) do if nt(i) then break else i:=i-2;
j:=x+2;
while (j>x) do if nt(j) then break else j:=j+2;
if x > ((i+j)/2) then writeln(f2,'true')


else writeln(f2,'false');

end;
end;
close(f1); close(f2);
End.
Bai 12: Cho một xâu s đếm xem trong xâu có mấy từ (từ là một
dÃy các ký tự liên tiếp không cha dấu cách) dl vào từ file văn bản
demtu.inp gồm một xâu ký tự không quá 255 kí tự, kết quả ghi ra
file demtu.out là số từ đếm đợc.
VD:
demtu.inp
Trung hc pho thong

demtu.out
4

{bai 12}
Var i:Integer;
f1,f2:text;
S: string;
d:byte;
begin
assign(f1,'demtu.inp'); assign(f2,'demtu.out');
reset(f1); rewrite(f2);
read(f1,s);
d:=0;
If s[1] <> ' ' then d:=d+1;
for i:=1 to length(s)-1 do
If (s[i] = ' ') and (s[i+1] <> ' ') then
d:=d+1;
Writeln(f2,d);

close(f1);close(f2);
END.


Bai 13: Xâu đảo
Dữ liêu vào từ file văn bản xaudao.inp chứa một xâu st
Kết quả ghi ra file vb xaudao.out xâu đảo ngợc của st
VD:
inp
Lop a1

out
1a poL

{bai 13}
Program

XAU1;

Var
f1: text;
f2:text;
st1,st2:string[20];
i:byte;
begin
assign(f1,'xaudao.inp'); reset(f1);
read(f1,st1);
st2:=' ';
for i:= length(st1) downto 1 do
st2:= st2+st1[i];

close(f1);
assign(f2,'xaudao.out'); rewrite(f2);
write(f2,st2);
close(f2);
end.
Bai 14. Viết chơng trình đọc từ tệp b11.inp xâu ký tự S và thông
báo ra tệp f2.out số lần xuất hiện của mỗi chữ cái tiếng Anh trong
S (Không phân biệt ch÷ hoa, ch÷ thêng)
VD:
B14.inp
baB

B14.out
Trong xau co 1 chu A


Trong xau co 2 chu B
{bai 14}
var s: string;
dem: Array['A'..'Z'] Of Byte;
n,i : byte;
ch:char;
f1,f2:text;
begin
assign(f1,'b11.inp'); reset(f1);
assign(f2,'b11.out'); rewrite(f2);
read(f1,s);
For ch:='A' To 'Z' Do dem[ch]:=0;
{Duy?t xâu}
For i:=1 To Length(S) Do

If ('A'<=Upcase(S[i])) and (upcase(s[i])<='Z') Then
Inc(dem[Upcase(S[i])]);
{Li?t kê các ky t? ra màn hình}
For ch:='A' To 'Z' Do if dem[ch]>0 then
writeln(f2,'Trong xau co ',dem[ch],' chu ',ch);
close(f1); close(f2);
end.

Bai 15: Xâu s1 có thể xuất hiện nhiều lần trong xâu s2. HÃy tìm
vị trí cuối cùng của xâu s1 trong xau s2
Input: gồm 2 dòng: mỗi dong cha 1 xâu
Output: là vị trí cần tìm
inp

ab
12abc564ghabt
rr


out

11

{bai 15}
Var s1, s2: string;
p, k, l1, l2: byte;
f1,f2:text;
Begin
assign(f1,'b27.inp'); assign(f2,'b27.out');
reset(f1); rewrite(f2);

readln(f1,s1);readln(f1,s2);
l1:=length(s1);
k:=0;
p:=pos(s1,s2);
While (p<>0) do
Begin
k:=k+p;
l2:=length(s2);
s2:=copy(s2, p+1, l2-p);
p:=pos(s1,s2);
End;
Writeln(f2,k);
close(f1); close(f2);
End.
Bài 16: Chuyển số thập phân sang hệ nhị phân
Dữ liệu vào từ tệp input:chữa 1 số thập phân
Dữ liệu ra: Là số ở hệ nhị phân tương ứng
INP
8
{bai 16}
var sr:string;
chuso:string[2];

OUT
1000


tp:longint;
du:byte;
f1,f2:text;

begin
chuso:='01';
assign(f1,'b16.inp'); reset(f1);
assign(f2,'b16.out'); rewrite(f2);
read(f1,tp);
{doi sang co so 2}
sr:='';
while tp >0 do
begin
du:=tp mod 2;
sr:=chuso[du+1]+sr;
tp:=tp div 2;
end;
write(f2,sr);
close(f1); close(f2);
end.
Bài 17: Chuyển số nhị phân sang hệ thập phân
Dữ liệu vào từ tệp input:chữa 1 dãy bit
Dữ liệu ra: Là số ở hệ thập phân tương ứng với dãy bit đó
INP
1100

OUT
12

var x,j,a,n:longint;
m: longint;
S:string;
f1,f2:text;
function luythua(x,n:longint):longint;

var m,i:longint;


begin
m:=1;
for i:=1 to n do m:=m*x;
luythua:=m;
end;
{=================================================================
==}
BEGIN
assign(f1,'cs2.inp');reset(f1);
assign(f2,'cs2.out');rewrite(f2);
readln(f1,S);
n:=0;a:=length(S);
for j:=1 to length(S) do
begin
val(S[j],m);
n:=n+luythua(2,a-1)*m;
dec(a);
end;
writeln(f2,n);
close(f1);close(f2);
END.

Bài 18: Chuyển số thập phân sang hệ 16
Dữ liệu vào từ tệp input:chữa 1 số thập phân
Dữ liệu ra: Là số ở hệ 16 tương ứng
INP
42

{bai18}
var s,sr:string;
chuso:string;

OUT
2A


tp:longint;
du:byte;
f1,f2:text;
begin
chuso:='0123456789ABCDEF';
assign(f1,'b18.inp'); reset(f1);
assign(f2,'b18.out'); rewrite(f2);
read(f1,tp);
{doi sang co so 16}
sr:='';
while tp >0 do
begin
du:=tp mod 16;
sr:=chuso[du+1]+sr;
tp:=tp div 16;
end;
write(f2,sr);
close(f1); close(f2);
end.
Bài 19: Chuyển số hệ 16 sang hệ thập phân
Dữ liệu vào từ tệp input:chữa 1 số ở hệ cơ số 16
Dữ liệu ra: Là số ở hệ thập phân tương ứng với dãy bit đó

INP
2A
{bai19}
var s:string;
chuso:string;
i,k:byte;
tp:longint;
f1,f2:text;

OUT
42


begin
chuso:='0123456789ABCDEF';
assign(f1,'b19.inp'); reset(f1);
assign(f2,'b19.out'); rewrite(f2);
read(f1,s);
{doi sang co so 10}
tp:=0;
for i:= 1 to length(s) do s[i]:=upcase(s[i]);
for i:=1 to length(s) do
begin
k:=pos(s[i],chuso)-1;
tp:=tp*16+k;
end;
write(f2,tp);
close(f1); close(f2);
end.
Bài 20. Đề thi 2007-2008

Bài 21. Đề thi 2008-2009
Bài 22. Đề thi 2009-2010
Bài 23. Đề 2010-2011
Bài 24. Đề 2011-2012
Bài 25. Cộng 2 số nguyên lớn (Để giải quyết những bài toán số lớn hơn 1018)
Tệp inp gồm 2 dòng, mỗi dòng chứa một số nguyên lớn
Tệp out là kết quả sau khi cộng
VD:
Cong.inp
123456789
987654321
Program so_lon;
var
st,s1,s2:ansistring;

Cong.out
1111111110


f1,f2:text;
l1,l2: longint;
Function Cong(s1,s2:ansistring):ansistring;
Var
Max,i,tam,a,b,code,nho:Integer;
h,h1:String;
Begin
L1:=length(s1);
L2:=length(s2);
if L1>L2 Then Max:=L1 Else Max:=L2;
For i:=L1+1 to Max do s1:='0'+s1;

For i:=L2+1 to Max do s2:='0'+s2;
nho:=0; h:='';
For i:=Max downto 1 do
Begin
val(s1[i],a,code);
val(s2[i],b,code);
tam:=a+b+nho;
if tam>=10 Then nho:=1 Else nho:=0;
str(tam Mod 10,h1);
h:=h1+h;
End;
if nho=1 Then h:='1'+h;
cong:=h;
End;
Begin
assign(f1,'cong.inp'); reset(f1);
assign(f2,'cong.out'); rewrite(f2);
readln(f1,s1); read(f1,s2);
write(f2, cong(s1,s2));
close(f1); close(f2);


End.
Bài 26. Trừ 2 số nguyên lớn (Để giải quyết những bài toán số lớn hơn 1018)
Tệp inp gồm 2 dòng, mỗi dòng chứa một số nguyên lớn
Tệp out là kết quả sau khi trừ số thứ nhất cho số thứ 2
VD:
Tru.inp
1000000


Tru.out
-1000000

2000000
program truxau;
var s1,s2:string;
f1,f2: text;
function tru(s1,s2:string):string;
var l1,l2:word;
s:String;
h,h1: ansistring;
max,i,a,b,tam,nho:word;
dau: string;
c:word;
begin
l1:=length(s1);
l2:=length(s2);
if l1>l2 Then Max:=l1 else Max:=l2;
for i:=l2+1 to Max do s2:='0'+s2;
for i:=l1+1 to Max do s1:='0'+s1;
if s2>s1 then
begin
s:=s2;s2:=s1;s1:=s;dau:='-';
end;
nho:=0;
h:='';
for i:= Max downto 1 do
begin
val(s1[i],a,c);
val(s2[i],b,c);

if a - nho begin
tam:=a+10-b-nho;
nho:=1;


end
else
begin
tam:=a-b-nho;
nho:=0;
end;
str(tam,h1);
h:=h1+h;
end;
h:=dau+h;
if h[1]='0' then delete(h,1,1);
if (h[2]='0') and (dau='-') then delete(h,2,1);
tru:=h;
end;
begin
assign(f1,'tru.inp'); reset(f1);
assign(f2,'tru.out'); rewrite(f2);
readln(f1,s1); read(f1,s2);
write(f2, tru(s1,s2));
close(f1); close(f2);
End.
Bài 27: Nhân 2 số nguyên lớn:
- Tệp input gồm 2 số nguyên m,n >0, mỗi số trên một dòng
- Tệp output là kết quả phép nhân

VD:
Nhan.inp
200000
1000000
Program nhan_hai_so;
Var s1,s2:String;
f1,f2: text;
l1,l2,i,j: longint;
C :Array[0..10000] of byte;
procedure nhap;
begin
assign(f1,'nhan.inp'); reset(f1);

Nhan.out
200000000000


assign(f2,'nhan.out'); rewrite(f2);
readln(f1,s1); read(f1,s2);
l1:=length(s1); l2:=length(s2);
end;
Procedure nhan;
Var a,b,code:word;
Begin
For i:=1 to l1+l2 do C[i]:=0;
For i:=1 to L1 do
For j:=1 to L2 do
Begin
val(s1[i],A,code);
val(s2[j],B,code);

c[i+j]:=c[i+j]+a*b;
End;
For i:=L1+L2 downto 3 do
Begin
c[i-1]:=c[i-1] + c[i] Div 10;
c[i]:=c[i] Mod 10;
End;
For i:=2 to L1+L2 do Write(f2,c[i]);
End;
Begin
nhap;
Nhan;
close(f1); close(f2);
End.
Bài 28. Đề 2012-2013
Bài 29. Đề 2013-2014
Bài 30. Đề 2014-2015


Bài 31. Đề 2015-2016
Bài 32. Đề 2016-2017
Bài 33. Đề 2017-2018
Bài 35: Kiểm tra 1 số nguyên dương có phải số siêu nguyên tố hay không? (số siêu
nguyên tố là số nguyên tố mà khi bỏ 1 số tùy ý các chữ số bên phải
của nó thì phần cịn lại vẫn là 1 số nguyên tố
vd: 2333 là 1 số siêu ngun tố có 4 chữ số vì 233, 23, 2 cũng là
các số nguyên tố.)
Dữ liệu vào chứa số nguyên n
Dữ liệu ra: Nếu là số siêu nguyên tố thì kết luận ‘dung’, ngược lại thì kết luận ‘sai’
Vd:

inp
24

out
sai

inp
23

inp
dung

Bài 36
Nhập một dãy A có N số tự nhiên (N<40), mỗi số không lớn hơn 1000 và 1 số K. Hãy xuất
ra các phần tử có số lần xuất hiện trong dãy A từ K lần trở lên ( Mỗi số chỉ xuất 1 lần)
Dữ liệu nhập: file DAYSO.INP:
- Dòng 1:số K
- Dòng 2: Dãy A
Kết quả: file DAYSO.OUT: xuất các số thỏa điều kiện trên, trường hợp khơng có số nào
thỏa thì xuất số -1
VD:
inp
2

out
4 xuat hien 3 lan

46745946

6 xuat hien 2 lan


inp
4

out
-1

46745946