Bài 46/2000 - Đảo
chữ cái
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R+,S+,T-,V+,X+,Y+}
{$M 16384,0,655360}
(*Du lieu vao: file
'inp.txt' voi cac tu khac nhau, moi tu ghi o mot dong;
Du lieu ra: file 'out.txt' *)
PROGRAM
Sinh_hoan_vi;
USES Crt;
CONST
MAX = 100;
INP = 'inp.txt';
OUT = 'out.txt';
TYPE
STR = array[0..max] of
char;
VAR
s :str;
f,g :text;
n :longint;
{ so luong tu}
time:longint ;
PROCEDURE Nhap_dl;
Begin
Assign(f,inp);
Assign(g,out);
Reset(f);
Rewrite(g);
Readln(f,n);
End;
PROCEDURE
DocDay(var s:str);
Begin
Fillchar(s,sizeof(s),chr(0));
While not eoln(f) do
begin
s[0]:=chr(ord(s[0])+1);
read(f,s[ord(s[0])]);
end;
End;
PROCEDURE
VietDay(s:str);
Var i :word;
Begin
For i:=1 to ord(s[0]) do Write(g,s[i]);
End;
PROCEDURE
Sap_xep(l,r:word);{ giai thuat Quicksort}
Var i,j :word;
tg,tam :char;
Begin
i:=l;j:=r;
tg:=s[(l+r) div 2];
Repeat
While ord(s[i]) < ord(tg) do inc(i);
While ord(s[j]) > ord(tg) do dec(j);
If i<=j then
begin
tam:=s[i];
s[i]:=s[j];
s[j]:=tam;
inc(i);
dec(j);
end;
Until i>j;
If j>l then Sap_xep(l,j);
If i<r then Sap_xep(i,r);
End;
PROCEDURE
Sinh_hv(s:str);
Var
vti,vtj,i,j:word;
stop :boolean;
tam
:char;
Begin
Writeln(g);
VietDay(s);
Repeat
Stop:=true;
For i:= ord(s[0]) downto 2 do
If s[i] > s[i-1] then
begin
vti:=i-1;
stop:=false;
For j:=ord(s[0]) downto vti+1 do
begin
If (ord(s[j])>ord(s[vti]))
then
begin
vtj:=j;
break;
end;
end;
tam:=s[vtj];
s[vtj]:=s[vti];
s[vti]:=tam;
For j:=1 to ((ord(s[0]) -
(vti+1))+1) div 2 do
begin
tam:=s[vti+j];
s[vti+j]:=s[ord(s[0])-j+1];
s[ord(s[0])-j+1]:=tam;
end;
Writeln(g);
VietDay(s);
break;
end;
Until stop;
End;
PROCEDURE Xu_ly;
Var i:longint;
Begin
For i:=1 to n do
begin
DocDay(s);
readln(f);
Sap_xep(1,ord(s[0]));
Sinh_hv(s);
Writeln(g);
end;
Close(f);
Close(g);
End;
BEGIN
Nhap_dl;
Xu_ly;
END.
(Lời giải của bạn
Nguyễn Việt Bằng - Lớp 10 Tin - Trường phổ thông Năng Khiếu - ĐHQG TPHCM)
Bài 47/2000 - Xoá số
trên vòng tròn
Lời giải 1:
Program vd;
Uses crt;
Var s:array[1..2000] of integer;
i:integer;
Begin
Clrscr;
for i:=0 to 1999 do
s[i]:=i+1;
s[2000]:=1;
i:=1;
repeat
s[i]:=s[s[i]];
i:=s[i];
until
s[i]=i;
writeln(i);
readln;
End.
(Lời
giải của bạn: Hà Huy Luân)
Lời
giải 2:
Program xoa_so;
Const N=2000;
Var x:integer;
Const N=2000;
Var x:integer;
Function topow(x:integer):integer;
Var P:integer;
Begin
P:=1;
Repeat
p:=p*2;
Until p>x;
topow:=p div 2;
End;
Var P:integer;
Begin
P:=1;
Repeat
p:=p*2;
Until p>x;
topow:=p div 2;
End;
BEGIN
x:=1+2*(N-topow(N));
write(x);
END.
write(x);
END.
(Lời giải của bạn: Nguyễn Quang
Trung - Lớp 12A Trường HERMANN GMEINER, Đà Lạt, Lâm Đồng)
Lời giải 3:
(* Thuat Giai Xu ly
Bit *)
USES Crt;
CONST
Max = 2000;
VAR
A: array[0..(MAX div
8)] of byte;
so: word;
FUNCTION Laybit(i:word):byte;
Var k:word;
Begin
k:=i div 8;
i:=i mod 8;
Laybit:=(a[k] shr (7-i)) and
1;
End;
PROCEDURE Tatbit(i:word);
Var k:word;
Begin
k:=i div 8;
i:=i mod 8;
a[k]:=a[k] and (not (1 shl
(7-i)));
End;
FUNCTION Tim(j:word):word;
Begin
While (laybit(j+1)=0) do
begin
If j=max-1 then j:=0
else inc(j);
end;
Tim:=j+1;
End;
PROCEDURE Xuly;
Var j,dem,i :word;
Begin
j:=1;dem:=0;
Fillchar(a,sizeof(a),255);
Tatbit(0);
Repeat
If j=max then j:=0;
j:=tim(j);
Tatbit(j);
inc(dem);
If
j=max then j:=0;
j:=tim(j);
Until dem=max-1;
For i:=0 to (max div
8) do
If a[i]<>0 then
break;
so:=i * (1 shl 3);
For i:=so to so+7 do
If Laybit(i)=1 then break;
so:=i;
Writeln(' SO TIM DUOC LA :',SO:4);
Writeln(' Press Enter to Stop.....');
readln;
End;
BEGIN
Clrscr;
Xuly;
END.
(Lời
giải của bạn: Nguyễn Việt Bằng - Lớp 10 Tin - Phổ thông Năng Khiếu - ĐHQG.TPHCM)
Bài 48/2000 - Những
chiếc gậy
(Dành cho học
sinh THPT)
Program bai48;
Var x:array[0..10000] of word;
d,a:array[1..1000] of byte;
n,p,s,gtmax:word;
fi,fo:text;
ok:boolean;
Procedure Q_sort(l,k:word);
Var h,i,j,t:word;
Begin
h:=a[(l+k)div 2];i:=l;j:=k;
Repeat
While a[i]>h do inc(i);
While a[j]<h do dec(j);
If i<=j then
Begin
t:=a[i];a[i]:=a[j];a[j]:=t;
inc(i);dec(j);
End;
Until i>j;
if i<k then Q_sort(i,k);
if j>l then Q_sort(l,j);
End;
Procedure phan(var ok:boolean);
Var i,p1,j:word;
Begin
Fillchar(x,sizeof(x),0);x[0]:=1;
For i:=1 to n do
If (d[i]=0) then
For j:=p downto a[i] do
If (x[j]=0) and(x[j-a[i]]<>0) then
Begin
x[j]:=i;
if j=p then
Begin
j:=a[i];
i:=n;
End;
End;
ok:=(x[p]<>0);
if ok then
Begin
p1:=p;
Repeat
d[x[p1]]:=1;
p1:=p1-a[x[p1]];
Until p1=0;
End;
End;
Procedure chat(Var ok:boolean);
Var i:word;
Begin
Fillchar(d,sizeof(d),0);
Repeat
phan(ok);
Until not ok;
ok:=true;
for i:= n downto 1 do
if d[i]=0 then
Begin
ok:=false;
break;
End;
End;
Procedure Tinh;
Begin
For p:=gtmax to s div 2 do
Begin
chat(ok);
if ok then
Begin
writeln(fo,p);
break;
End;
End;
If not ok then
Writeln(fo,s);
End;
Procedure Start;
Var i:word;
Begin
assign(fi,'input.txt');reset(fi);
assign(fo,'output.txt');rewrite(fo);
While not seekeof(fi) do
Begin
Readln(fi,n);
if n<>0 then
Begin
gtmax:=0;s:=0;
for i:=1 to n do
Begin
Read(fi,a[i]);
s:=s+a[i];
if a[i]> gtmax then
gtmax:=a[i];
End;
Q_sort(1,n);
Tinh;
End;
End;
Close(fi);Close(fo);
End;
Begin
Start;
End.
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
(Lời giải của bạn Tăng Hải Anh - Hải Dương - TP. Hải Phòng)
Bài
49/2001 - Một chút nhanh trí
(Dành cho học sinh Tiểu học)
Theo giả thiết khi chia A và lập phương của A cho một số lẻ
bất kỳ thì nhận được số dư như nhau, tức là: A3 (mod N) = A (mod N),
ở đây N số lẻ bất kỳ, chọn N lẻ sao cho N > A3 thì ta phải có A3=
A suy ra A=1.
Vậy chỉ có số 1 thoả mãn điều kiện của bài toán.
Bài 50/2001 - Bài toán đổi màu bi
(Dành cho học sinh
THCS và PTTH)
Program ba_bi;
Uses crt;
var v,x,d:integer;
BEGIN
Clrscr;
writeln('v x d ?(>=0)');
readln(v,x,d);
if ((v-x)mod 3 =0)and((x+d)*(v+d)<>0)
then
while (v+x)<>0 do
begin
d:=d-1+3*((3*v*x)div(3*v*x-1));
x:=x+2-3*((3*x)div(3*x-1));
v:=v+2-3*((3*v)div(3*v-1));
writeln('>> ',v,' ',x,' ',d);
end
else writeln('Khong duoc !');
readln;
END.
(Lời
giải của bạn:Nguyễn Quang Trung)
Bài 51/2001 - Thay thế từ
(Dành cho học sinh THCS và PTTH)
program thaythetu;
var
source,des:array[1..50]of string;
n:byte;
procedure init;
var
i:byte;
s:string;
f:text;
begin
assign(f,'input2.txt');
reset(f);
n:=0;
while not
eof(f) do
begin
readln(f,s);
inc(n);
while (s<>'')and(s[1]=' ') do
delete(s,1,1);
if
i>0 then
begin
i:=pos(' ',s);
des[n]:=copy(s,1,i-1);
while (i<=length(s))and(s[i]=' ') do
i:=i+1;
source[n]:=copy(s,i,length(s)-i+1);
end;
end;
end;
procedure replace;
var
f,g:text;
s:string;
i,k:byte;
begin
assign(f,'input1.txt');
reset(f);
assign(g,'kq.out');
rewrite(g);
while not
eof(f) do
begin
readln(f,s);
for
k:=1 to n do
for i:=1 to length(s)-length(des[k])+1 do
if des[k]=copy(s,i,length(des[k])) then
begin
delete(s,i,length(des[k]));
insert(source[k],s,i);
i:=i+length(source[k]);
end;
writeln(g,s);
end;
close(f);
close(g);
end;
begin
init;
replace;
end.
Bài 52/2001 - Xác định các tứ
giác đồng hồ trong ma trận
(Dành cho học sinh THCS và PTTH)
uses crt;
var
s,n,i,k,j,a1,a2,b1,b2:integer;
chon,mau:byte;
a:array[1..100,1..100]of integer;
{----------------------------}
procedure nhap;
begin
write('nhap
n>=2:');readln(n);
for i:=1 to n do
for j:=1 to n do
begin
write('nhap a[',i,'j]:');
readln(a[i,j]);
end;
end;
{----------------------}
procedure tinh;
begin
clrscr;
nhap;
s:=0;
for i:=1 to n-1 do
for j:=1 to n-1 do
if
((a[i,j]<a[i,j+1])and(a[i,j+1]<a[i+1,j+1])and(a[i+1,j+1]<a[i+1,j]))
or((a[i,j+1]<a[i+1,j+1])and(a[i+1,j+1]<a[i+1,j])and(a[i+1,j]<a[i,j]))
or((a[i+1,j+1]<a[i+1,j])and(a[i+1,j]<a[i,j])and(a[i,j]<a[i,j+1]))
or((a[i+1,j]<a[i,j])and(a[i,j]<a[i,j+1])and(a[i,j+1]<a[i+1,j+1]))
then inc(s);
writeln;
writeln;
writeln;
writeln('So luong
tu giac dong ho la:',s);
readln;
end;
{-----------------}
procedure max;
var t:integer;
begin
writeln('Nhap
n>=2:');readln(n);
i:=1;
a1:=1;a2:=n;
b1:=1;b2:=n;
mau:=0;
t:=0;
while i<=n*n do
begin
for k:=a1 to a2 do
begin
a[b1,k]:=i;
gotoxy(5*k,b1);
inc(mau);
if mau>15 then mau:=1;
textcolor(mau);
write(i);
delay(70);inc(i);
end;
for k:=b1+1 to b2+t do
begin
a[k,a2]:=i;
gotoxy(5*(a2),k);
inc(mau);
if mau>15 then
mau:=1;
textcolor(mau);
write(i);
delay(70);
inc(i);
end;
for k:=b2+t downto b1+1 do
begin
a[k,b2]:=i;
gotoxy(5*(b2-1),k);
inc(mau);
if mau>15 then mau:=1;
textcolor(mau);
write(i);
delay(70);
inc(i);
end;
for k:=a2-2 downto a1 do
begin
a[b1+1,k]:=i;
gotoxy(5*k,b1+1);
inc(mau);
textcolor(mau);
write(i);
delay(70);
inc(i);
end;
dec(a2,2);
dec(b2,2);
inc(t,2);
inc(b1,2);
end;
if n>2 then
s:=3*(n-2) else s:=1;
writeln;writeln;
writeln('Bang dong
ho max');writeln;
writeln('Voi ma
tran vuong cap ',n,'thi so luong tu giac dong ho lon nhat la:',s);
readln;
End;
{------------------}
procedure min;
begin
clrscr;
writeln('n>=2:');readln(n);
i:=1;
b1:=1;
while i<=n*n do
begin
for k:=1 to n do
begin
a[b1,k]:=i;
inc(mau);
if mau>15 then mau:=1;
textcolor(mau);
gotoxy(5*k,b1);
write(i);
delay(70);
inc(i);
end;
inc(b1);
end;
writeln;writeln;writeln('Bang
tren s co gia tri=0');
readln;
End;
{------------------------------}
BEGIN
Clrscr;
repeat
textcolor(white);
writeln('1:cau a (Tinh so luong S)');
writeln('2:cau b (Lap bang co S lon nhat)');
writeln('3:cau c (Lap bang co S nho nhat)');
writeln('4:thoat');
writeln('Chon chuc nang:');readln(chon);
case chon of
1: begin
clrscr;
tinh;
end;
2: begin
clrscr;
max;
end;
3: begin
clrscr;
min;
end;
end;{of Case}
clrscr;
until chon=4;
END.
(Lời
giải của bạn:Nguyễn Việt Hoà)
Bài 53/2001 - Lập lịch tháng
kỳ ảo
(Dành cho học sinh THCS và PTTH)
(* Tat ca cac lich
deu la lich ki ao *)
Program bai 53;
uses crt;
Const
out='lichao.out';
Type
mang=array[1..6,1..7] of integer;
Var a:mang;
i,j,dem:integer;
s:real;
f:text;
(*--------------------------------------*)
PROCEDURE Viet;
Var i,j:integer;
Begin
inc(dem);
writeln(f,'Kha nang thu ',dem);
for i:=1 to 6 do
begin
for j:=1 to 7 do
if a[i,j]<>0 then write(f,a[i,j]:3)
else write(f,'':3);
writeln(f);
end;
writeln(f);
End;
(*------------------------------------------*)
PROCEDURE
Laplich(k,t:integer);
Var i,j,i1:integer;
Begin
for i1:=k to t+k-1 do
begin
j:=i1 mod 7;
i:=i1 div 7;
if j=0 then
begin
j:=7;
dec(i);
end;
a[i+1,j]:=i1-k+1;
end;
viet;
End;
(*-------------------------------------------*)
PROCEDURE Xuli;
Var
i,j,k,t:integer;
Begin
for k:=1 to 7 do
for t:=28 to 31 do
begin
fillchar(a,sizeof(a),0);
Laplich(k,t);
end;
End;
(*---------------------------------------------*)
BEGIN
clrscr;
assign(f,out);
rewrite(f);
dem:=0;
Xuli;
close(f);
END.
(Lời
giải của bạn: Đỗ Ngọc Sơn)
Bài 54/2001 - Bạn hãy gạch số
(Dành cho học sinh Tiểu học và THCS)
Chúng ta viết ra 10 số nguyên tố đầu tiên:
2 3 5 7 11 13 17 19 23 29
là số có 16 chữ số, có thể chứng minh không khó khăn lắm
rằng sau khi gạch đi 8 chữ số thì số nhỏ nhất có thể được là: 11111229; còn số
lớn nhất có thể được là: 77192329. Thật vậy:
a. Gạch đi 8 chữ số, để số còn lại là một số có 8 chữ số là nhỏ nhất (giữ
nguyên thứ tự ban đầu). Nhìn vào dãy số ở trên ta thấy số 1 là nhỏ nhất, có năm
chữ số 1 và sau chữ số 1 thứ năm này lại còn nhiều hơn 3 chữ số khác nữa. Do đó,
5 chữ số đầu của số cần tìm chắc chắn
phải là 5 chữ số 1. Lí luận tương tự, để tìm được 3 chữ số còn lại.
b. Tương tự như thế: chữ số 9 là lớn nhất, nhưng sau chữ số 9 đầu tiên
lại chỉ còn lại 4 chữ số (mà ta cần giữ lại số có 8 chữ số), nên ta không thể
chọn số 9 là chữ số đứng đầu trong 8 chữ số cần tìm. Chữ số lớn thứ hai là 7,
có hai chữ số 7, tất nhiên ta chọn chữ số 7 đầu tiên (vì sau chữ số 7 thứ 2 chỉ
còn lại 6 chữ số). Lí luận tương tự, ta tìm được chữ số thứ hai trong 8 chữ số
cần tìm cũng là chữ số 7, và 6 chữ số còn lại phải tìm tất nhiên là 6 chữ số
sau chữ số 7 này.
Bài 55/2001 - Bài toán che
mắt mèo
(Dành cho học sinh THCS và PTTH)
Program Che_Mat_meo;
Uses crt;
Const td=200;
Var i,j,n:integer;
out:string;
f:text;
Procedure Xuli;
Begin
for i:=1 to
n do
begin
gotoxy(15,i+3);
for j:=1 to
n do
begin
if (odd(i))and(odd(j)) then
begin
textcolor(11);
if
out<>'' then write(f,'M ')
else
begin
write('M ');
delay(td);
end;
end
else
begin
textcolor(14);
if
out<>'' then write(f,'o ')
else
begin
write('o ');
delay(td);
end;
end;
end;
writeln(f);
end;
End;
BEGIN
Clrscr; textcolor(2);
Write('Nhap n= ');
Readln(n);
if n<=20 then
out:=''
else
begin
out:='matmeo.inp';
writeln('Mo File
meo.inp de xem ket qua');
end;
Assign(f,out);
Rewrite(f);
writeln(f,'(Chu M Ki hieu
cho con meo, chu o ki hieu cho quan co)');
Xuli; writeln(f);
Writeln(f,'Tong cong co
',sqr((n+1) div 2),' con meo');
Close(f);
Readln;
END.
(Lời
giải của bạn Đỗ Ngọc Sơn - Quảng Ninh)
Bài 56/2001 - Chia lưới
(Dành cho học sinh PTTH)
Program Chia_luoi ;
Uses Crt ;
Const Fi = 'LUOI.INP';
Fo = 'LUOI.OUT';
Var A : Array[1..20,1..20]Of
Integer ;
B : Array[1..20,1..20]Of
0..1 ;
Px,Py: Array[1..4] Of
ShortInt ;
M,N,S,S1,S2 : LongInt ;
F : Text ;
Procedure Read_Input ;
Var i,j :Integer;
Begin
Clrscr ; S:= 0 ;
Assign(F,Fi) ;Reset(F) ;
Readln(F,M,N);
For i:=1 to M
do
Begin
For j:=1 to
N do
Begin
Read(F,A[i,j]);
S:=S+A[i,j];
End;
Readln(F);
End;
Close(F);
End;
Procedure Innit ;
Begin
S1 := S div 2;
Px[1]:= 0 ;Px[2]:= 0 ;Px[3]:=1 ;Px[4]:=-1 ;
Py[1]:= 1 ;Py[2]:=-1 ;Py[3]:=0 ;Py[4]:= 0 ;
End ;
Procedure Write_Output ;
Var i,j :Integer;
Begin
Assign(F,Fo); ReWrite(F);
For i:=1 to
M do
Begin
For j:=1 to
N do
Write(F,B[i,j],' ');
Writeln(F);
End;
Close(F);Halt;
End;
Function Ktra(x,y : Integer) : Boolean
;
Begin
Ktra:= False ;
If (x in
[1..M]) And (y in [1..N]) And
(B[x,y] = 0 ) Then
Ktra := True ;
End;
Procedure Try(x,y:Integer ;Sum :LongInt);
Var i :Integer ;
Begin
For i:=1 to
4 do
If
Ktra(x+Px[i],y+Py[i]) Then
Begin
x := x + Px[i] ;
y := y + Py[i] ;
Sum := Sum + A[x,y];
B[x,y] := 1;
If Sum = S2 Then
Write_Output ;
Try(x,y,Sum) ;
Sum := Sum - A[x,y];
B[x,y] := 0;
x := x - Px[i] ;
y := y - Py[i] ;
End ;
End;
Procedure Run ;
Var i,j : Integer ;
Begin
Read_Input ;Innit ;
For i:=1 to
M do
For j:=1 to
N do
If A[i,j]>=
S1 Then
Begin
Fillchar(B,SizeOf(B),0);
B[i,j]:=1;
Write_Output;
End ;
For S2 := S1 downto
1 do
Begin
Fillchar(B,SizeOf(B),0);
B[1,1]:=1;
Try(1,1,A[1,1]);
End;
End;
BEGIN
Run;
END.
(Lời giải của bạn Lê Sơn Tùng -
Vĩnh Phúc )
Bài
57/2001 - Chọn số
(Dành cho học sinh Tiểu học và
THCS )
Giả sử có m số 1, n số -1 (m, n nguyên dương) theo giả
thiết:
a) m + n = 2000, suy ra m, n cùng tính chẵn lẻ.
+ Nếu m chẵn, do đó n cũng chẵn, ta chọn ra m/2 số 1 và n/2
số -1.
+ Nếu m lẻ, n lẻ:
m = 2k +1 = k + (k + 1)
n = 2q +1 = q + (q
+ 1)
Luôn có: k - q =
(k+1) - (q+1), do đó ta sẽ chọn k số 1 và q số -1.
Vậy ta luôn có thể chọn ra các số thỏa mãn điều kiện của
bài toán.
b) m + n = 2001 -> m và n không cùng tính chẵn lẻ.
+ Nếu m chẵn -> n phải là lẻ:
m = 2k = i + j (giả sử chọn i số 1, giữ lại j số 1)
n = 2q +1 = t + s
(giả sử chọn t số -1, giữ lại s số -1)
Theo cách chọn này -> i, j phải cùng tính chẵn lẻ; t, s
không cùng tính chẵn lẻ.
Giả sử i chẵn, j chẵn, t lẻ, s chẵn, do đó: i + t ¹ j + s, như vậy cách chọn này không thỏa mãn. Các trường
hợp còn lại xét tương tự.
Do đó, với trường hợp này không thể có cách chọn nào thỏa
mãn điều kiện của bài toán.
Bài 58/2001 - Tổng các số tự
nhiên liên tiếp
(Dành cho học sinh THCS và
PTTH)
Program bai58;
Uses crt;
var N:longint;
m,i,dem,a,limit:longint;
procedure Solve;
begin
Writeln('Chia so ',N,':');
limit:=trunc(sqrt(1+8*N)+1) div 2;
for m:=2 to limit-1 do
if ((N-m*(m-1) div 2) mod
m =0) then
begin
a:=(N-m*(m-1) div 2) div
m;
inc(dem);
writeln('+ Cach thu ',dem,' :');
for i:=a to a+m-1 do
begin
write(' ',i);
if (i-a+1) mod 10=0 then
writeln;
end;
writeln;
end;
end;
BEGIN
clrscr;
writeln('Nhap N: ');readln(N);
Solve;
if dem=0 then writeln('Khong
the chia!')
else writeln('Co tat ca', dem,' cach
chia!');
readln;
END.
(Lời giải của bạn Nguyễn Quốc
Quân - Lớp 11 T2 - Trường PTTH Lê Viết Thuật - Vinh)
Bài 59/2001 - Đếm số ô vuông
(Dành cho học sinh THCS và PTTH)
Uses crt;
Const Ngang = ‘ngang.inp’;
Doc
= ‘doc.inp’;
Max
= 100;
n: integer = 0;
count: integer =0;
Var f1,f2:text;
o,i,j:integer;
a,b,c:array[1..max] of
boolean;
BEGIN
clrscr;
Assign(f1,ngang); Assign(f2,doc);
Reset(f1); Reset(f2);
While not eoln(f1) do
begin
Read(f1,o);
Inc(n);
If o=1 then a[n]:=true
else a[n]:=false
end;
Readln(f1);
for i:= 1 to n do
begin
for j:= 1 to n do
begin
Read(f1,o);
If o=1 then b[j]:=true
else b[j]:=false;
end;
Readln(f1);
for j:=1 to n+1 do
begin
Read(f2,o);
If o=1 then c[j]:=true
else c[j] := false
end;
Readln(f2);
for j:=1 to n do
begin
If (a[j] and b[j] and
c[j] and c[j+1]) then
inc(count);
end;
a:=b;
end;
Close(f1); Close(f2);
Write('Co', count, ‘hinh vuong!’);
Readln;
END.
(Lời giải của bạn Nguyễn Chí Thức - Lớp 10A1 - Khối
chuyên Toán Tin - ĐH Sư phạm Hà Nội)
Bài 60/2001 - Tìm số dư của phép chia
(Dành
cho học sinh Tiểu học)
Vì 1976 và 1977 là 2 số nguyên liên tiếp nên nguyên tố cùng
nhau, do đó số thoả mãn điều kiện của bài toán phải có dạng:
n = 1976*1977*k +76 (k là số nguyên)
nhưng 1976*1977 lại chia hết cho 39 nên phần dư của n khi
chia cho 39 sẽ là 37 (= 76 - 39).
Bài 61/2001 - Thuật toán điền
số vào ma trận
(Dành
cho học sinh THCS và PTTH)
Program Bai61;
Uses crt;
Var
a:array[2..250,2..250] of -1..1;
n,i,j:integer;
BEGIN
Write('Doc
vao n:'); Readln(n);
Fillchar(a,
sizeof (a), 0);
for i:=1 to
n do
for j:=1
to n do
begin
If
(i mod 2 <> 0) and (j mod 2 <> 0) then a[i,i] := 1;
If
(i mod 2 = 0) and (j mod 2 = 0) then a[i,i] := -1;
end;
Writeln('Mang da dien la: ');
for i:=1 to
n do
begin
for
j:=1 to n do Write(a[i,j]:3);
Writeln;
end;
Write('Tong
lon nhat la:');
If n mod 2 =
0 then Write(0) else Write(n);
Readln;
END.
(Lời
giải của bạn Trương Đức Hạnh - 12 Toán Năng Khiếu - Hà Tĩnh)
Bài
62/2001 - Chèn Xâu
(Dành
cho học sinh THCS và PTTH)
Do sơ
xuất khi ra đề nên trong số các lời giải của bạn đọc gửi đến toà soạn, có thể
các bạn đã hiểu đề bài theo 2 cách sau đây, ta coi như hai bài toán:
1. Nếu
theo ví dụ, thì ta cần chèn dấu vào xâu (không cần đủ 9 số như trong xâu S, có
thể bớt một số số cuối của xâu, nhưng phải theo thứ tự) để phép tính nhận được
bằng M cho trước.
2. Ta
không để ý đến ví dụ của đề ra, yêu cầu cần chèn dấu vào giữa các số trong xâu
'123456789' để nhận được kết quả M cho trước.
Sau đây là lời giải của bạn Nguyễn Chí Thức (hiểu theo bài toán 1):
Program Bai62;
Uses crt;
Const fo = 'chenxau.out';
dau: array[1..3] of String[1]= ('', '-',
'+');
s:array[1..9] of
char=('1','2','3','4','5','6','7','8','9');
Var d:array[1..9]
of String[1];
m:longInt;
f:text;
k:integer;
found:boolean;
Procedure Init;
Begin
Write('Cho M=');
Readln(m);
found:=false;
end;
Function
tinh(s:string):longint;
Var i,t:longint;
code:integer;
Begin
i:=length(s);
While not(s[i] in ['-','+']) and (i>0) do
dec(i);
val(copy(s,i+1,length(s)-i),t,code);
If i=0 then begin tinh:=t; exit; end
else
begin
delete(s,i,length(s)-i+1);
If s[i]='+' then tinh:=t+tinh(s);
If s[i]='-' then tinh:=tinh(s)-t;
end;
End;
Procedure
Test(i:integer);
Var st:string;
j:integer;
Begin
st:='';
For j:=1 to i do st:=st+d[j]+s[j];
If Tinh(st) = m then begin writeln(f,st);
found:=true; end;
End;
Procedure
Try(i:integer);
Var j:integer;
Begin
for j:=1 to 3 do
begin
d[i]:=dau[j]; Test(i);
If i<9 then try(i+1);
end;
End;
BEGIN
Clrscr;
Init;
Assign(f,fo);Rewrite(f);
for k:=1 to 2 do
begin
d[1]:=dau[k];
Try(2);
end;
If not found then write(f,'khong co ngiem');
Close(f);
END.
Từ lời giải trên của bạn Thức, để thoả mãn yêu cầu
của bài toán 2, trong thủ tục Try cần sửa lại như sau:
Procedure
Try(i:integer);
Var j:integer;
Begin
for j:=1 to 3 do
begin
d[i]:=dau[j];
If i<9 then try(i+1);
If i=9 then Test(i);
end;
End;
Không có nhận xét nào:
Đăng nhận xét