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

Tai lieu boi duong HSG tin hoc 8

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 (198.83 KB, 25 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>CHUYÊN ĐỀ XỬ LÝ SỐ - XỬ LÝ CHUỖI</b>
<b>Bài 1: XỬ LÝ CHỮ SỐ </b>


1.<b>Lấy chữ số bằng chuỗi (xâu ký tự ) </b>
 Thủ tục biến đổi giữa chuỗi và số.


Val(s,x) Thủ tục Chuyển chuỗi số s thành con số x
Str(x,s) Thủ tục Chuyễn con số x thành chuỗi số s


 Qui tắc : + Lấy một biến chuỗi chứa con số
+ Sử dụng cấu trúc chuỗi lấy chữ số :


Khi biến chuỗi được nhập hay gán giá trị như S:= ’3456’


Chuỗi S có cấu trúc mãng nghĩa là S[n] là ký tự thứ n của chuỗi
S


Như S[1] là ký tự ‘3’, S[2] là ký tự ‘4’, S[1] là ký tự ‘5’,...
+ Dùng hàm biến chuỗi chữ số thành con số để xử lý :


 Ví dụ : Viết chương trình nhập vào con số nguyên dương n và tính tổng
các chữ số của n. Lưu ý n có số chữ số từ 1 đến 255.


Chương trình


Program Tongchuso;
uses Crt;


<b>Var conso:string;</b>


function TCS(x:string):integer;


Var i,chuso,tong:integer;
Begin


tong:=0;


For i:=1 to length(x) do


Khai báo tên chương trình
Sử dụng đơn vị lệnh Crt


<b>Khai báo biến tồn cục conso kiểu chuỗi</b>
Khai báo hàm TCS với tham trị x kiểu chuỗi


Khai báo biến cục bộ i, chuso, tong kiểu số nguyên
Gán giá trị biến tong ban đầu bằng 0


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

begin


val(x[i],chuso);
tong:=tong+chuso;
end;


TCS:=tong;
end;


Begin


clrscr; write(' Nhap con so:') ;readln(conso);
writeln(' Tong chu so = ', TCS(conso));
readln;



end.


Tong mới bằng tổng cũ công chuso
Gán TCS là tong đã tính được


Xố màn hình; nhập con số


- Bài tập:


Bài 1: Con số nguyên dương n gọi là con số song trùng m với m là số
nguyên dương khi n chia hết cho m và tổng chữ số của n cũng chia hết cho m.
Viết chương trình


a) Nhập vào n, m. Hãy cho biết n có là số song trùng hay khơng?


b) Nhập vào hai số nguyên dương k, h , tìm tất cả số song trùng m từ k đến
h?


Bài 2: Con số nguyên dương n gọi là song tố khi n là số nguyên tố và tổng
chữ số của nó cũng là số nguyên tố. Hãy viết chương trình nhập vào 2 số
nguyên dương k, h, hãy tìm số tất cả con số song tố từ k đến h?


Bài 3: Con số nguyên dương gọi là số nhị nguyên khi n có dạng 3k + 1 và
tổng các chữ số của n cũng có dạng 3k +1. Viết chương trình nhập vào 2 số
nguyên dương k, h. Hãy tìm các số nhị nguyên từ k đến h?


</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

có từ 2 chữ số trở lên thì lại tính tổng chữ số của n1 ta được n2, tiếp tục đến
khi chỉ còn 1 chữ số. Viết chương trình nhập vào số n và cho biết sau khi biến
đổi số n theo cách nêu trên ta được con số m là bao nhiêu?



2.<b>Mã ACCII của ký tự số </b>


 Các hàm, thủ tục về mã accii của ký tự


ord(ch) Hàm Tính mã số accii của ký tự ch
Chr(n) Hàm Cho ra ký tự có mã accii là n


Mã số accii ký tự số: ‘0’,’1’,...,’9’ là 48,49,...,58 nghĩa là ord(‘1’) =49
, chr(48)=’0’


 Lọc chữ số trong một chuỗi có nhiều loại ký tự:


+ Lấy từng ký tự trong chuỗi S, dùng biến ký tự ch:= S[i]


+ Sử dụng điều kiện tập hợp: ch in [‘0’..’9’] để lọc ký tự chữ số
 Ví dụ: Viết chương trình nhập vào một chuỗi gồm các ký tự là mẫu tự,
khoảng trắng và chữ số. Các chữ số liền nhau trong chuỗi tạo thành con
số. Hãy cho biết có bao nhiêu con số trong chuỗi?.


Program locso;
uses Crt;


Var ch:char; i,n,dodai,dem:integer;s:string;
Begin


clrscr;write('Nhap chuoi s= ');readln(s);
dem:=0;


ch:=s[1]; dodai:=0; if (ch in ['0'..'9']) then


dodai:=1;


for i:=2 to length(s) do


Khai báo biến


Nhập chuỗi, gán giá trị biến dem=0


Biến ch nhận ký tự thứ nhất của chuỗi s, nếu ch thuộc
tập ký tự số thì biến dodai là 1


Lặp từ 2 đến cuối chuỗi
biến ch lấy ký tự thứ i


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

begin
ch:=s[i];


if ch in ['0'..'9'] then dodai:=dodai+1
else if dodai>0 then begin dem:=dem+1;
dodai:=0; end;


end;


if dodai>0 then dem:=dem+1;


writeln('So con so trong chuoi s la ', dem);
readln;


end.



Đến hết chuỗi dodai>0 thi dem tang 1


 Bài tập :


Bài 1: Cho một chuỗi S gồm các ký tự là mẫu tự, khoảng trắng và chữ số.
Viết chương trình tính tổng các chữ số có trong chuỗi?


Ví dụ: S =’a12bc 5qwer100’ tổng các chữ số có trong chuỗi là 9


Bài 2: Cho một chuỗi S gồm các ký tự là mẫu tự, khoảng trắng và chữ số.
Các chữ số liền nhau trong chuỗi tạo thành con số. Viết chương trình tính tổng
các con số trong chuỗi?


Ví dụ: S =’a12bc 5qwer100’ tổng các con số có trong chuỗi là 117


Bài 3: Cho một chuỗi S gồm các ký tự là mẫu tự, khoảng trắng và chữ số.
Các chữ số liền nhau trong chuỗi tạo thành con số. Viết chương trình tìm con
số trong chuỗi chia hết cho 7?


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

rồi đến các mẫu tự, ở cuối chuỗi là khoảng trắng bảo đảm thứ tự ban đầu giữa
các chữ số và bảo đảm ban đầu giữa các mẫu tự.


Ví dụ: S =’a12b c5’ khoảng trắng duy nhất ở vị trí 5
+ Đổi b vị trí 4 về vị trí 5 của khoảng trắng S=’a12 bc5’
+ Đổi a vị trí 1 về vị trí 4 của khoảng trắng S=’ 12abc5’
+ Đổi 1 vị trí 2 về vị trí 1 của khoảng trắng S=’1 2abc5’
+ Đổi 2 vị trí 3 về vị trí 2 của khoảng trắng S=’12 abc5’
+ Đổi 5 vị trí 7 về vị trí 3 của khoảng trắng S=’125abc’


3.<b>Lấy chữ số bằng số </b>


- Phép toán về số


Phép tốn cơng dụng Ví dụ


:= Phép gán giá trị cho biến x:=6 ; x:= y;


+, -, *, / Phép cộng, trừ, nhân. chia x:=x+1;x:=y-1;x:= 2*y;x:=y/2
Div Chia lấy phần nguyên x:=10 div 3 ta có x là 3


Mod Chia lấy phần dư x:=10 mod 3 ta có x là 1


- Một số hàm về số:


Tên Loại ý nghĩa


Int(x) hàm tính số thực là phần nguyên của x
Frac(x) hàm tính số thực là phần phân của x


Trunc(x) hàm Tính số nguyên là phần nguyên cuûa x


Str(x:n:m,S) Thủ tục Chuyển số x thành chuỗi S với n ký tự và m số thập phân
- Số nguyên n:


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

+ Lấy chữ số hàng chục: m:= (n div 10) mod 10;
+ Lấy chữ số hàng trăm: m:= (n div 100) mod 10;
- Số thập phân x:


+ Lấy chữ số hàng đơn vị: n:= trunc(x);m:= n mod 10;


+ Lấy chữ số hàng chục: n:= trunc(x);m:= (n div 10) mod 10;


+ Lấy chữ số hàng trăm: n:= trunc(x);m:= (n div 100) mod 10;
+ Lấy chữ số thập phân thứ nhất (hàng phần chục): n:=


trunc(x*10);m:= n mod 10;


+ Lấy chữ số thập phân thứ hai (hàng phần trăm): n:=
trunc(x*100);m:= n mod 10;


+ Lấy chữ số thập phân thứ ba (hàng phần nghìn): n:=
trunc(x*1000);m:= n mod 10;


 Ví dụ: Viết chương trình nhập 2 số thực x, y và số nguyên dương n. Tính
tổng các chữ số thập phân thứ nhất đến chữ số thập thân thứ n của x
chia y;


Program chusothapphan;
uses Crt;


Var x,y,z:real;m,n,k,tong :longint;


function luythua(coso,somu:integer):longint;
var i,giatri:longint;


begin


giatri:=1; for i:=1 to somu do giatri:=giatri*coso;
luythua:=giatri;


Khai báo hàm luỹ thừa với 2 tham trị coso, somu
Lặp từ 1 đến somu giatri moi = giatri cũ nhân cơ


số


Nhập x,


Nhập y, Nhập n


Xuất ra màn hình kết quả x/y với 15 chữ số thập
phân


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

end;
Begin


clrscr; write('Nhap x='); readln(x);


write('Nhap y='); readln(y); write('Nhap n=');
readln(n);


Writeln(' x/y =',x/y:0:15);
tong:=0;


For m:=1 to n do
begin


z:= (x/y)*luythua(10,m);n:=trunc(z); k:=n mod
10;


tong:=tong+k;
end;


Writeln('Tong chu so thap phan (1-n) la ',tong);


readln;


end.


lấy chữ số thập phân thứ m


<b>BÀI 3: HỆ CƠ SỐ</b>
1.<b>Định nghóa : </b>


 Con số có n chữ số a1a2a3...an trong hệ đếm cơ số g thoả


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

+ Giá trị con số ở hệ thập phân cơ số mười bằng :a1.gn-1 + a2.gn-2


+ . . .+an.g0.


Ví dụ con số 12304 ở hệ cơ số 4


với hệ thập phân cơ số 10 có giá trị 1 . 43<sub> + 2 . 4</sub>2 <sub>+ 3 . 4</sub>1<sub> + 0 . 4</sub>0<sub> = </sub>


108


 Các hệ cơ số đếm thông dụng :


+ Hệ nhị phân : hệ đếm cơ số g =2 + Hệ bát phân : hệ đếm cơ số g =8
+ Hệ thập phân : hệ đếm cơ số g =10 + Hệ Thập lục phân : hệ đếm cơ số
g = 16 khi đó A,B,C,D,E,F là các chữ số có giá trị là 10,11,12,13,14,15.


2.<b>Các hàm cơ bản : </b>


 Từ hệ cơ số g(nhỏ hơn hoặc bằng16) chuyển sang hệ thập phân :


Phân tích : Ở cơ số g ta có a1a2a3...an = a1.gn-1 + a2.gn-2 + . . .+an.g0


của hệ thập phân. Như vậy hệ cơ số g chuyển sang hệ thập phân thực


chất là bài tốn tính tổng. Nếu khơng biến đổi mà tính từng thừa số
mỗi thừa số phải tính luỹ thừa . Để giảm thời gian tính tổng ta tính
như sau


Bước 1: tổng = a1


Bước 2: tổng mới = tổng cũ .g + a2 = a1.g +


a2...


Bước n : tổng mới = tổng cũ . g + an


Thieát kế : tổng là a1


Lặp i từ 2 đến độ dài chuỗi


tổng mới = tổng cũ . g + ai


</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

Program giatritp;
Uses crt;


Var conso:string; coso:byte;


Function HTP(xconso:string;xcoso:byte):longint;
Var i,h,n,x:byte;tong: longint; ch:string; k:integer;
begin



ch:=xconso[1] ; h:=pos(ch,'ABCDEF');


if h=0 then val(ch,x,k) else x:=h+9; tong:=x;
For i:=2 to length(conso) do


begin


ch:=xconso[i]; h:=pos(ch,'ABCDEF');
if h = 0 then val(ch,x,k) else x:=h+9;
Tong:= tong*xcoso+ x;


end;


HTP:=tong;
end;


Begin


clrscr;write('Nhap conso =');readln(conso);
write('Nhap he co so =');readln(coso);


writeln('gia tri he thap phan la ', HTP(conso,coso));
readln; end.


Tìm vi trí ký tự trong 'ABCDEF'
Tính giá trị của chữ số


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

Phân tích : Chuyển con số ở hệ thập phân thành con số ở hệ cơ số g
là ta tìm a1a2a3...an trong biểu diển con số x = a1.gn-1 + a2.gn-2 + . . .



+an.g0


Ta viết lại x = (a1.gn-2 + a2.gn-3 + . . .+ an-1)g+an.


 an là số dư của con số chia cho g


Ta lại tính (a1.gn-2 + a2.gn-3 + . . .+ an-1) laø x chia cho g lấy phần


thương y


Ta lại viết y = (a1.gn-2 + a2.gn-3 + . . .+an-2)g+ an-1


 an-1 là số dư y chia cho g


tiếp tục cho đến khi kết quả của thương là 0


Ví dụ : chuyển con số 237 hệ thập phân thành con số ở cơ số g=7
Lấy 237 chia g=7 dư 6 thương 33


Lấy thương là 33 chia 7 dư 5 thương 4 nhỏ hơn 7


Lấy thương là 4 chia 7 dư 4 thương là 0 dừng phép chia ta được
con số 456


Người ta thường trình bày :
237 7


6 33 7
5 4 7


4 0


<b>Thiết kế: tạm là x; </b>


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

tạm mới bằng thương của tam cũ chia cho cơ số


Kết thúc lặp khi tam =0; Viết ngược các số dư ta được con số.
<b>Chương trình </b>


Program hecoso;
Uses crt;


var conso:longint;coso:byte;ketqua:string;
Procedure HCS(xconso:longint;xcoso:byte;
Var s:string);


Var tam:longint; stam,ch:string; i:byte;
Begin


tam:=xconso; stam:='';
repeat


i:= tam mod xcoso;


if i>9 then ch:= chr(i+55) else str(i,ch);
stam:=stam+ch;tam:= tam div xcoso;
until tam =0;


S:=''; for i:=length(stam) downto 1 do S:=
S+Stam[i];



end;
Begin


clrscr;write('Nhap conso =');readln(conso);


Lấy số dư


Nếu i>9 chuyển thành chữ A,B,C,D....
còn chuyển sang chữ số ,Chuỗi tạm nối
thêm ký tự


Lấy thương


</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

write('Nhap he co so =');readln(coso);
HCS(conso,coso,ketqua);


writeln('he co so ',coso,'la ', ketqua);
readln;


end.


BÀI 4: XỬ LÝ BÍT
1.<b>GIỚI THIỆU: </b>


Trong máy tính tất cả các dữ liệu đều được biểu diển dưới dạng bit ( Biểu
diễn dưới dạng nhị phân hệ cơ số 2 ). Ở đây ta chỉ xét đến cách biểu diễn
số nguyên.


Trong pascal dữ liệu nguyên : byte (8 bit) , integer và word (16 bit) ,


longint (32 bit)


a. <i><b>Ưu điểm của phương pháp xử lí bit: Dùng ít miền lưu trữ. Nhờ đó, có </b></i>


thể giải quyết nhiều bài tốn có kích thước lớn. Chương trình chạy
nhanh.


b.<i><b>Phạm vi áp dụng của phương pháp xử lí bit:</b></i>


 Thay thế mảng Boolean bằng mảng số ngun có kích thước nhỏ hơn
8 lần.


 Thay thế các phép nhân, div, mod một số nguyên với một số có dạng
2n<sub> bằng các tốn tử xử lí bit (Bitwise). Thực hiện nhanh hơn rất nhiều</sub>


so với các phép nhân, div, mod thơng thường.
 Thay thế các phép tốn trên tập hợp.


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

a.Dịch chuyển bit sang trái : ShL (Shift Left). Cú pháp : n
ShL i


Ý nghĩa :dịch chuyển các bit của n sang trái i vị trí , những bít trống
điền 0.


Tương đương phép toán : n shl i = n . 2i
Ví dụ: 5 ShL 3


5 = 0 0 0 0 0 1 0 1


5 ShL 3 = 0 0 1 0 1 0 0 0



b.Dịch chuyển bit sang phải : ShR(Shift Right) Cú pháp : n
ShR i


Ý nghĩa:dịch chuyển các bit của n sang phải i vị trí, những bít trống
điền 0.


Tương đương phép toán : n shr i = n div 2i
Ví dụ: 13 ShR 2


13 = 0 0 0 0 1 1 0 1


13 ShR 2 = 0 0 0 0 0 0 1 1


c. <i><b>Các phép tính :</b></i>


bit a bít b not a a and b a Or b a Xor b


0 1 1 0 1 0


0 0 1 0 0 0


1 1 0 1 1 1


1 0 0 0 1 0


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

d.<i><b>Cơng thức tính tốn nhanh: Với a và n là 2 số nguyên</b></i>


<i><b>dương. Số nhân hoặc số chia có dạng 2</b><b>n</b><b><sub>.</sub></b></i>



a * 2n<sub> = a ShL n ; a div 2</sub>n<sub> = a ShR n ; a mod 2</sub>n <sub>= a And (2</sub>n<sub> - 1)</sub>


e. <i><b>Ứùng dụng:</b></i>


<i><b>Lấy bít thứ i của số nguyên x :</b></i>


Các bít của số nguyên x được đếm từ 0 và từ phải sang trái


13 = 0 0 0 0 1 1 0 1


bít thứ 7 6 5 4 3 2 1 0
Như vậy lấy bít thứ i của số nguyên x ta:


Dịch chuyển x sang phải i vị trí. ( x ShR i ). Sau đó AND 1.
Hàm lấy bít thứ i


Function LayBit(x, i: Byte) : Byte;


Begin LayBit := (x ShR (i-1)) And 1; End;


Chuyển biểu diễn từ thập phân sang nhị phân:
- Lặp từ bit 0 đến bit 7 (hay 15) của số nguyên x:
- Lấy từng bit ra và đổi thành kí tự '0' hoặc '1'.
- Gán kí tự vào chuỗi nhị phân.


Function DecToBin(x:Byte): String;
Var i: byte; S: String;


Begin S[0] := #8;



</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

DecTobin := S;
End;


Chú ý: b + 48 = b Or 48 với b = 0 hoặc 1.
Chuyển biểu diễn từ nhị phân sang thập phân:
- Lặp từ kí tự thứ nhất đến hết chuỗi nhị phân:


- Lấy từng kí tự và đổi thành số 0 hoặc số 1. ( Ord(b[i]) and 1 )
- Nhân số thập phân với 2 và cộng thêm số mới.


Function BinToDec(b: String) : Byte;
Var i, d: Byte;


Begin d:= 0;


For i := 1 To Length(b) Do d := d ShL 1 Or Ord(b[i]) and 1;
BinToDec := d;


End;


Chú ý: Ord(b[i]) And 1 = Ord(b[i]) - 48 với b[i] = ‘0’ hoặc ‘1’.
Gán bằng 1 cho bit thứ i của số nguyên x:


- Dùng phép OR số x với một số chỉ có bit thứ i bằng 1.
x = 10010 ( i = 2 )


</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

Procedure GanBit1(Var x: Byte; i: Byte);
Begin x := x Or (1 ShL i); End;


Gán bằng 0 cho bit thứ i của số nguyên x:



Dùng phép AND số x với một số chỉ có bit thứ i bằng 0.
x = 10110 ( i = 2 )


And 11011 ( = NOT(1 ShL 2))
x = 10010


Procedure GanBit0(Var x: Byte; i: Byte);
Begin x := x And Not(1 ShL i); End;


<b>BÀI 4: XỬ LÝ SỐ</b>


Các bài toán xử lý số tập trung vào các dạng chủ yếu sau:
1.<b>Kiểm tra dạng số </b>


 Vấn đề: Kiểm tra một số có thoả một điều kiện nào đó
 Cấu trúc chung:


+ Viết hàm kiểm tra điều kiện


+ Nếu con số thoả điều kiện thì báo đúng cịn báo khơng


 Ví dụ1: Viết chương trình nhập vào số nguyên dương n, kiểm tra số n có
dạng 5k+3 hay khơng (k là số ngung dương)? Nếu có xuất ra màn
hình giá trị của k, nếu khơng hiện ra màn hình chữ ‘khong’


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

uses Crt;


Var n,k :longint;



function ktdang(conso:longint):longint;
var i:longint;


begin
i:=-1;


if (conso-3) mod 5 =0 then i:= (conso-3) div 5;
ktdang:=i;


end;
Begin


clrscr; write('Nhap n='); readln(n);
k:=ktdang(n);


if n>0 then Writeln('n = 5k+3 voi k=',k);
readln;


end.


 Ví dụ 2:Viết chương trình nhập vào số ngun dương n kiểm tra số n có
dạng 3k<sub> +5 hay khơng (k là số ngung dương)? Nếu có xuất ra màn </sub>


hình giá trị của k, nếu khơng hiện ra màn hình chữ ‘khong’
Chương trình


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

Var n,k :longint;


function ktdang(conso:longint):longint;


var i,tam:longint;


begin


i:=0;tam:=conso-5;


While (tam>1) and (tam mod 3=0) do
begin


i:=i+1;tam:= tam div 3;
end;


ktdang:=i;
end;


Begin


clrscr; write('Nhap n='); readln(n);
k:=ktdang(n);


if k>0 then Writeln('n = 3^k+5 voi k=',k);
readln; end.


 Bài tập:


+ Viết chương trình nhập vào số nguyên dương n, kiểm tra số n có dạng
5k+3h hay khơng (k, h là số ngung dương)? Nếu có xuất ra màn hình giá trị
của k, h, nếu khơng hiện ra màn hình chữ ‘khong’


+ Viết chương trình nhập vào số nguyên dương n kiểm tra số n có dạng 3k



+5h<sub> hay khơng (k,h là số ngung dương)? Nếu có xuất ra màn hình giá trị của </sub>


</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

2.<b>Tìm số thoả yêu cầu </b>


 Vấn đề : Tìm các số thoả một điều kiện
 Cấu trúc chung


+ Viết hàm kiểm tra điều kiện


+ Lặp từ số ban đầu cho đến số cuối
nếu con số thoả điều kiện thì hiện ra


 Ví dụ 1: Viết chương trình nhập vào phân số có tử và mẫu số là hai số m,
n nguyên dương. Tối giản phân số đã cho.


Chương trình
Program timso2;
uses Crt;


Var tu,mau,tu1,mau1 :longint;


function UCLN(so1,so2:longint):longint;
var tam1,tam2:longint;


begin


tam1:=so1; tam2:=so2;
while (tam1<>tam2) do



if tam1 > tam2 then tam1:=tam1-tam2 else tam2:=tam2-tam1;
UCLN:=tam1;


end;
Begin


</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

tu1:= tu div UCLN(tu,mau); mau1:= mau div UCLN(tu,mau);
Writeln('tu moi:',tu1,'mau moi:',mau1);


readln;
end.


 Ví dụ 2: Viết chương trình nhập vào số ngun dương n, a, b. Tìm tất cả
các số từ a đến b có dạng 2k<sub> +7</sub>h<sub> +4.</sub>


Chương trình
Program timso;
uses Crt;


Var n,a,b,dem :longint;k,h:byte;


function ktdang(conso:longint;var xk,xh:byte):boolean;
var i,tam1,tam2,tam:longint;kq:boolean;


begin


kq:=false;i:=1; tam:=(conso div 2 )+1;
while (i<=tam) and (kq=false) do
begin



i:=i+1;tam1:=i; xk:=0;xh:=0;


While (tam1>1) and (tam1 mod 2=0) do
begin xk:=xk+1;tam1:= tam1 div 2; end;
if (xk>0) and (conso-4-tam1>0) then


begin


</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

While (tam2>1) and (tam2 mod 7=0) do
begin xh:=xh+1;tam2:= tam2 div 7;end;
end;


if (xk>0) and (xh>0) then kq:=true;
end;


ktdang:=kq;
end;


Begin


clrscr; write('Nhap a='); readln(a);write('Nhap b='); readln(b); dem:=0;
for n:=a to b do


if ktdang(n,k,h)=true then


begin dem:=dem+1;Writeln(dem,':',n,'=2^',k,'+7^',h,'+4 ');end;
readln;


end.



 Bài tập


+ Bài 1: Một số n nguyên dương được gọi là số tựa nguyên tố khi tổng các
ước số ( khơng tính 1 và n) là một số nguyên tố. Viết chương trình nhập vào 2
số nguyên dương a, b, tìm tất cả các số tựa nguyên tố từ a đến b.


+ Bài 2: Viết chương trình nhập vào hai số nguyên dương a, b. Tìm tất cả
các số từ a đến b sau cho số dó phân tích thành tổng hai số nguyên tố.


+Bài 3: Viết chương trình nhập vào số nguyên dương n. Hãy phân tích n
thành tích các thừa số nguyên tố.


</div>
<span class='text_page_counter'>(22)</span><div class='page_container' data-page=22>

 Vấn đề : Cho một qui tắt biến đổi số, xác định con số kết quả sau khi
biến đổi


 Cấu trúc chung


+ Tìm quy luật chung của qui tắc biến đổi ( Các trường hợp chung và
riêng)


+ Lặp với số lần áp dụng qui tắc
Thực hiện biến đổi số


 Ví dụ 1: Cho hai số nguyên dương m, n người ta biến đổi 2 số bằng qui
tắc sau: con số m mới bằng là số dư của tổng hai số chia cho m, con số
n mới là tích hai số trừ cho n. Viết chương trình nhập vào các số


nguyên dương m, n, k, Hãy tìm con số m, n sau khi thực hiên k lần qui
tắc biến đổi hai số trên.



+ Viết thủ tục một bước biến đổi qui tắc


Tam1 := m, tam2:=n; m:= (tam1+tam2) mod m; n:=tam1. tam -n ;
+ Lặp từ 1 đến k gọi thủ tục qui tắc biến đổi;


 Bài tập:


Bài 1: Người ta biến đổi con số n nguyên dương với m lần theo qui tắc
như sau: Đổi con số n về hệ nhị phân với 16 bít, đổi bít thứ k (k ≤ 16) là 0
thành 1, 1 thành 0.


Bài 2: Cho con số n nguyên dương người ta biến đổi co số theo qui
tắc như sau:


</div>
<span class='text_page_counter'>(23)</span><div class='page_container' data-page=23>

Hãy viết chương trình nhập vào số nguyên dương n, k. Hãy cho biết sau thực
hiện k lần biến đổi số n theo qui tắc trên.


<b>BÀI 5: XỬ LÝ CHUỖI</b>
1.<b>Hàm và thủ tục về chuỗi </b>


Tên Loại ý nghĩa


+ Phép tốn Nối hai chuỗi


ord(ch) Hàm Tính mã số của ký tự ch


length(s) Hàm Tính độ dài thật sự của chuỗi S
Pos(s1,s) Hàm Tính vị trí của s1 trong s


Copy(s,n,m) Hàm Lấy chuỗi con từ S, tại vị trí n với m ký tự


Insert(s1,S,n) Thủ tục Chèn s1 vào s tại vị trí n


Val(s,x,k) Thủ tục Chuyển chuỗi số s thành con số x
Delete(s,n,m) Thủ tục Xố trong chuỗi s từ vị trí n , m ký tự


2.<b>Tìm kiếm chuỗi con (ký tự, từ, chuỗi con) </b>
 Vấn đề:


 Cấu trúc chung


+ Viết hàm kiểm tra điều kiện


+ Lặp từ đầu chuỗi cho đến cuối chuỗi
nếu chuỗi con thoả điều kiện thì hiện ra


 Ví dụ 1: Viết chương trình nhập vào một chuỗi S, hãy cho biết chuỗi S
có bao nhiêu loại ký tự.


+ chuỗi ký tự đã xét xetS:=’’; dem:=0;
+ Lặp từ 1 đến số phần tử của chuỗi


</div>
<span class='text_page_counter'>(24)</span><div class='page_container' data-page=24>

Dem:=dem+1; setS:=xetS+kýtư


 Ví dụ 2: Một từ là các mẫu tự liền nhau. Viết chương trình nhập vào một
chuỗi hãy cho biết chuỗi có bao nhiêu từ.


+ Lặp từ đầu chuỗi đến cuối chuỗi


Nếu ký tự thuộ tập ‘a’..’z’ thì độ dài đoạn con tăng 1



Còn nếu độ dài đoạn con lớn hơn 1 thì đếm tắng 1 và độ dài đoạn con
bằng 0


Bài tập


Bài 1: Viết chương trình nhập vào 1 chuỗi S chỉ gồm chữ số 0,1..,9 hoặc
mẫu tự a,b. ..z. Hãy tìm một đoạn con của S gồm các mẫu tự liên tiếp nhau dài
nhất.


Bài 2: Một từ là các mẫu tự liền nhau. Viết chương trình nhập vào một
chuỗi S. Hãy tìm từ dài nhất trong chuỗi.


Bài 3: Viết chương trình nhập vào một chuỗi S chỉ gồm các mẫu tự. Hãy
tìm đoạn ký mẫu tự liên tiến dài nhất trong chuỗi bảo đảm thứ tự a,b,c.


3.<b>Biến đổi chuỗi </b>


 Vấn đề: Cho một qui tắt biến đổi chuỗi, xác định chuỗi kết quả sau khi
biến đổi


Cấu trúc chung


+ Tìm quy luật chung của qui tắc biến đổi ( Các trường hợp chung và
riêng)


+ Lặp với số lần áp dụng qui tắc
Thực hiện biến đổi số


</div>
<span class='text_page_counter'>(25)</span><div class='page_container' data-page=25>

Do chuỗi kết thúc các ký tự a liền nhau ở đầu, đến các ký tự b
liền nhau, đến các ký tự c liền nhau cuối cùng là khoảng trắng.



Ta gọi số ký tự a là na , số ký tự b là nb, số ký tự c là nc  độ dài
chuỗi là na+nb+nc+1. Khi đó mỗi ký tự a vị trí đúng của nó là từ 1 
na, ký tự b vị trí đúng là từ na+1na+nb, ký tự c có vị trí đúng là
na+nb+1 na+nb+nc


Để số lần đổi chổ ít nhất ta chuyển một ký tự sai vị trí về vị trí đúng của
nó như chuỗi kết thúc. Như vậy ban đầu (cuối chuỗi) ta chuyển một ký tự sai
vị trí về khoảng trắng. khi khoảng trắng khơng cuối dãy ta chuyển phần tử
sai vị trí về khoảng trắng về đúng vị trí.


 Bài tập


Bài 1: Cho một chuỗi có n ký tự khác nhau, và một số k nguyên dương
(k<n). Người ta biến đổi chuỗi như sau: Đầu tiên từ đầu chuỗi đếm 1 cho đến k
bỏ ký tự tại vị trí k ra khỏi chuỗi, đếm ký tự kế tiếp lại từ 1 nếu hết chuỗi thì
đếm tiếp từ đầu chuỗi cho đến k bỏ ký tự tại vị trí k ra khỏi chuỗi, tiếp tục cho
đến khi chòn một ký tự. Viết chương trình nhập vào số nguyến dương n, k hãy
cho biết vị trí ban đầu của ký tự còn lại khi thực hiện biến đổi trên.


</div>

<!--links-->

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×