Nếu số chữ số của con số là lẻ thì ta tách con số làm hai con số, con số thứ nhất lấy nửa dầu các chữ số n giữ nguyên thứ tự nhiều hơn nửa sau 1 chữ số , con số thứ 2 lấy nửa còn lại c[r]
(1)CHUYÊN ĐỀ XỬ LÝ SỐ - XỬ LÝ CHUỖI Bài 1: XỬ LÝ CHỮ SỐ
1.Lấy chữ số chuỗi (xâu ký tự ) Thủ tục biến đổi chuỗi số
Val(s,x) Thủ tục Chuyển chuỗi số s thành số x Str(x,s) Thủ tục Chuyễn số x thành chuỗi số s
Qui tắc : + Lấy biến chuỗi chứa số + Sử dụng cấu trúc chuỗi lấy chữ số :
Khi biến chuỗi nhập hay gán giá trị S:= ’3456’
Chuỗi S có cấu trúc mãng nghĩa S[n] ký tự thứ n chuỗi S
Như S[1] ký tự ‘3’, S[2] ký tự ‘4’, S[1] ký tự ‘5’, + Dùng hàm biến chuỗi chữ số thành số để xử lý :
Ví dụ : Viết chương trình nhập vào số nguyên dương n tính tổng chữ số n Lưu ý n có số chữ số từ đến 255
Chương trình
Program Tongchuso; uses Crt;
Var conso:string;
function TCS(x:string):integer; Var i,chuso,tong:integer; Begin
tong:=0;
For i:=1 to length(x)
Khai báo tên chương trình Sử dụng đơn vị lệnh Crt
Khai báo biến toàn cục conso kiểu chuỗi Khai báo hàm TCS với tham trị x kiểu chuỗi
Khai báo biến cục i, chuso, tong kiểu số nguyên Gán giá trị biến tong ban đầu
(2)begin
val(x[i],chuso); tong:=tong+chuso; end;
TCS:=tong; end;
Begin
clrscr; write(' Nhap so:') ;readln(conso); writeln(' Tong chu so = ', TCS(conso)); readln;
end
Tong tổng cũ công chuso Gán TCS tong tính
Xố hình; nhập số
- Bài tập:
Bài 1: Con số nguyên dương n gọi số song trùng m với m số nguyên dương n chia hết cho m tổng chữ số n 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ó số song trùng hay khơng?
b) Nhập vào hai số nguyên dương k, h , tìm tất số song trùng m từ k đến h?
Bài 2: Con số nguyên dương n gọi song tố n số nguyên tố tổng chữ số số nguyên tố Hãy viết chương trình nhập vào số nguyên dương k, h, tìm số tất số song tố từ k đến h?
Bài 3: Con số nguyên dương gọi số nhị nguyên n có dạng 3k + tổng chữ số n có dạng 3k +1 Viết chương trình nhập vào số nguyên dương k, h Hãy tìm số nhị nguyên từ k đến h?
(3)có từ chữ số trở lên lại tính tổng chữ số n1 ta n2, tiếp tục đến cịn chữ số Viết chương trình nhập vào số n cho biết sau biến đổi số n theo cách nêu ta số m bao nhiêu?
2.Mã ACCII ký tự số
Các hàm, thủ tục mã accii ký tự
ord(ch) Hàm Tính mã số accii ký tự ch Chr(n) Hàm Cho ký tự có mã accii n
Mã số accii ký tự số: ‘0’,’1’, ,’9’ 48,49, ,58 nghĩa ord(‘1’) =49 , chr(48)=’0’
Lọc chữ số chuỗi có nhiều loại ký tự:
+ Lấy ký tự 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 chuỗi gồm ký tự mẫu tự, khoảng trắng chữ số Các chữ số liền chuỗi tạo thành số Hãy cho biết có số 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)
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ứ chuỗi s, ch thuộc tập ký tự số biến dodai
Lặp từ đến cuối chuỗi biến ch lấy ký tự thứ i
(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 so chuoi s la ', dem); readln;
end
Đến hết chuỗi dodai>0 thi dem tang
Bài tập :
Bài 1: Cho chuỗi S gồm ký tự mẫu tự, khoảng trắng chữ số Viết chương trình tính tổng chữ số có chuỗi?
Ví dụ: S =’a12bc 5qwer100’ tổng chữ số có chuỗi
Bài 2: Cho chuỗi S gồm ký tự mẫu tự, khoảng trắng chữ số Các chữ số liền chuỗi tạo thành số Viết chương trình tính tổng số chuỗi?
Ví dụ: S =’a12bc 5qwer100’ tổng số có chuỗi 117
Bài 3: Cho chuỗi S gồm ký tự mẫu tự, khoảng trắng chữ số Các chữ số liền chuỗi tạo thành số Viết chương trình tìm số chuỗi chia hết cho 7?
(5)rồi đến mẫu tự, cuối chuỗi khoảng trắng bảo đảm thứ tự ban đầu chữ số bảo đảm ban đầu mẫu tự
Ví dụ: S =’a12b c5’ khoảng trắng vị trí + Đổi b vị trí vị trí khoảng trắng S=’a12 bc5’ + Đổi a vị trí vị trí khoảng trắng S=’ 12abc5’ + Đổi vị trí vị trí khoảng trắng S=’1 2abc5’ + Đổi vị trí vị trí khoảng trắng S=’12 abc5’ + Đổi vị trí vị trí khoảng trắng S=’125abc’
3.Lấy chữ số số - Phép tốn 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 ta có x
Mod Chia lấy phần dư x:=10 mod ta có x laø
- Một số hàm số:
Tên Loại ý nghĩa
Int(x) hàm tính số thực phần nguyên x Frac(x) hàm tính số thực phần phân x
Trunc(x) hàm Tính số nguyên phần nguyên x
Str(x:n:m,S) Thủ tục Chuyển số x thành chuỗi S với n ký tự m số thập phân - Số nguyên n:
(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ứ (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 số thực x, y số nguyên dương n Tính tổng chữ số thập phân thứ đến chữ số thập thân thứ n 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 giatri:=giatri*coso; luythua:=giatri;
Khai báo hàm luỹ thừa với tham trị coso, somu Lặp từ đến somu giatri moi = giatri cũ nhân số
Nhập x,
Nhập y, Nhập n
Xuất hình kết x/y với 15 chữ số thập phân
(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 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ÀI 3: HỆ CƠ SỐ 1.Định nghóa :
Con số có n chữ số a1a2a3 an hệ đếm số g thoả
(8)+ Giá trị số hệ thập phân số mười :a1.gn-1 + a2.gn-2
+ +an.g0
Ví dụ số 12304 hệ số
với hệ thập phân số 10 có giá trị 43 + 42 + 41 + 40 =
108
Các hệ số đếm thông dụng :
+ Hệ nhị phân : hệ đếm số g =2 + Hệ bát phân : hệ đếm số g =8 + Hệ thập phân : hệ đếm số g =10 + Hệ Thập lục phân : hệ đếm số g = 16 A,B,C,D,E,F chữ số có giá trị 10,11,12,13,14,15
2.Các hàm :
Từ hệ số g(nhỏ bằng16) chuyển sang hệ thập phân : Phân tích : Ở số g ta có a1a2a3 an = a1.gn-1 + a2.gn-2 + +an.g0
của hệ thập phân Như hệ số g chuyển sang hệ thập phân thực
chất tốn tính tổng Nếu khơng biến đổi mà tính thừa số thừa số phải tính luỹ thừa Để giảm thời gian tính tổng ta tính sau
Bước 1: tổng = a1
Bước 2: tổng = tổng cũ g + a2 = a1.g +
a2
Bước n : tổng = tổng cũ g + an
Thieát keá : tổng a1
Lặp i từ đến độ dài chuỗi
tổng = tổng cũ g +
(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)
begin
ch:=xconso[i]; h:=pos(ch,'ABCDEF'); if h = 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ự 'ABCDEF' Tính giá trị chữ số
(10)Phân tích : Chuyển số hệ thập phân thành số hệ số g ta tìm a1a2a3 an biểu diển 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 số dư số chia cho g
Ta lại tính (a1.gn-2 + a2.gn-3 + + an-1) 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 số dư y chia cho g
tiếp tục kết thương
Ví dụ : chuyển số 237 hệ thập phân thành số số g=7 Lấy 237 chia g=7 dư thương 33
Lấy thương 33 chia dư thương nhỏ
Lấy thương chia dư thương dừng phép chia ta số 456
Người ta thường trình bày : 237
6 33
Thiết kế: tạm x;
(11)tạm thương tam cũ chia cho số
Kết thúc lặp tam =0; Viết ngược số dư ta số Chương trình
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 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 chuyển sang chữ số ,Chuỗi tạm nối thêm ký tự
Lấy thương
(12)write('Nhap he co so =');readln(coso); HCS(conso,coso,ketqua);
writeln('he co so ',coso,'la ', ketqua); readln;
end
BAØI 4: XỬ LÝ BÍT 1.GIỚI THIỆU:
Trong máy tính tất liệu biểu diển dạng bit ( Biểu diễn dạng nhị phân hệ số ) Ở ta xét đến cách biểu diễn số nguyên
Trong pascal liệu nguyên : byte (8 bit) , integer word (16 bit) , longint (32 bit)
a Ưu điểm phương pháp xử lí bit: Dùng miền lưu trữ Nhờ đó, có
thể giải nhiều tốn có kích thước lớn Chương trình chạy nhanh
b.Phạm vi áp dụng phương pháp xử lí bit:
Thay mảng Boolean mảng số nguyên có kích thước nhỏ lần
Thay phép nhân, div, mod số nguyên với số có dạng 2n tốn tử xử lí bit (Bitwise) Thực nhanh nhiều
so với phép nhân, div, mod thông thường Thay phép toán tập hợp
(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 bit n sang trái i vị trí , bít trống điền
Tương đương phép toán : n shl i = n 2i Ví dụ: ShL
5 = 0 0 1
5 ShL = 0 1 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 bit n sang phải i vị trí, bít trống điền
Tương đương phép toán : n shr i = n div 2i Ví dụ: 13 ShR
13 = 0 0 1
13 ShR = 0 0 0 1
c Các phép tính :
bit a bít b not a a and b a Or b a Xor b
0 1
0 0
1 1 1
1 0
(14)d.Cơng thức tính tốn nhanh: Với a n số nguyên
dương Số nhân số chia có dạng 2n.
a * 2n = a ShL n ; a div 2n = a ShR n ; a mod 2n = a And (2n - 1)
e Ứùng dụng:
Lấy bít thứ i số nguyên x :
Các bít số nguyên x đếm từ từ phải sang trái
13 = 0 0 1
bít thứ Như lấy bít thứ i số nguyên x ta:
Dịch chuyển x sang phải i vị trí ( x ShR i ) Sau AND 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 đến bit (hay 15) số nguyên x: - Lấy bit đổi thành kí tự '0' '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;
(15)DecTobin := S; End;
Chú ý: b + 48 = b Or 48 với b = Chuyển biểu diễn từ nhị phân sang thập phân: - Lặp từ kí tự thứ đến hết chuỗi nhị phân:
- Lấy kí tự đổi thành số số ( Ord(b[i]) and ) - Nhân số thập phân với cộng thêm số
Function BinToDec(b: String) : Byte; Var i, d: Byte;
Begin d:= 0;
For i := To Length(b) Do d := d ShL Or Ord(b[i]) and 1; BinToDec := d;
End;
Chú ý: Ord(b[i]) And = Ord(b[i]) - 48 với b[i] = ‘0’ ‘1’ Gán cho bit thứ i số nguyên x:
- Dùng phép OR số x với số có bit thứ i x = 10010 ( i = )
(16)Procedure GanBit1(Var x: Byte; i: Byte); Begin x := x Or (1 ShL i); End;
Gán cho bit thứ i số nguyên x:
Dùng phép AND số x với số có bit thứ i x = 10110 ( i = )
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ÀI 4: XỬ LÝ SỐ
Các toán xử lý số tập trung vào dạng chủ yếu sau: 1.Kiểm tra dạng số
Vấn đề: Kiểm tra số có thoả điều kiện Cấu trúc chung:
+ Viết hàm kiểm tra điều kiện
+ Nếu số thoả điều kiện báo cịn báo khơng
Ví dụ1: Viết chương trình nhập vào số ngun dương n, kiểm tra số n có dạng 5k+3 hay khơng (k số nguyêng dương)? Nếu có xuất hình giá trị k, khơng hình chữ ‘khong’
(17)uses Crt;
Var n,k :longint;
function ktdang(conso:longint):longint; var i:longint;
begin i:=-1;
if (conso-3) mod =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 +5 hay khơng (k số ngung dương)? Nếu có xuất
hình giá trị k, khơng hình chữ ‘khong’ Chương trình
(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) 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 số ngung dương)? Nếu có xuất hình giá trị k, h, khơng 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 hay không (k,h số nguyêng dương)? Nếu có xuất hình giá trị
(19)2.Tìm số thoả yêu cầu
Vấn đề : Tìm số thoả đ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 số cuối số thoả điều kiện
Ví dụ 1: Viết chương trình nhập vào phân số có tử mẫu số 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)
if tam1 > tam2 then tam1:=tam1-tam2 else tam2:=tam2-tam1; UCLN:=tam1;
end; Begin
(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ố nguyên dương n, a, b Tìm tất số từ a đến b có dạng 2k +7h +4.
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 )+1; while (i<=tam) and (kq=false) begin
i:=i+1;tam1:=i; xk:=0;xh:=0;
While (tam1>1) and (tam1 mod 2=0) begin xk:=xk+1;tam1:= tam1 div 2; end; if (xk>0) and (conso-4-tam1>0) then
begin
(21)While (tam2>1) and (tam2 mod 7=0) 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
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 gọi số tựa nguyên tố tổng ước số ( khơng tính n) số nguyên tố Viết chương trình nhập vào số nguyên dương a, b, tìm tất 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 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 thừa số nguyên tố
(22) Vấn đề : Cho qui tắt biến đổi số, xác định số kết sau biến đổi
Cấu trúc chung
+ Tìm quy luật chung qui tắc biến đổi ( Các trường hợp chung riêng)
+ Lặp với số lần áp dụng qui tắc Thực biến đổi số
Ví dụ 1: Cho hai số nguyên dương m, n người ta biến đổi số qui tắc sau: số m số dư tổng hai số chia cho m, số n tích hai số trừ cho n Viết chương trình nhập vào số
nguyên dương m, n, k, Hãy tìm số m, n sau thực hiên k lần qui tắc biến đổi hai số
+ Viết thủ tục bước biến đổi qui tắc
Tam1 := m, tam2:=n; m:= (tam1+tam2) mod m; n:=tam1 tam -n ; + Lặp từ đế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 số n nguyên dương với m lần theo qui tắc sau: Đổi số n hệ nhị phân với 16 bít, đổi bít thứ k (k ≤ 16) thành 1, thành
Bài 2: Cho số n nguyên dương người ta biến đổi co số theo qui tắc sau:
(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 k lần biến đổi số n theo qui tắc
BÀI 5: XỬ LÝ CHUỖI 1.Hàm thủ tục chuỗi
Tên Loại ý nghĩa
+ Phép toán Nối hai chuỗi
ord(ch) Hàm Tính mã số ký tự ch
length(s) Hàm Tính độ dài thật chuỗi S Pos(s1,s) Hàm Tính vị trí s1 s
Copy(s,n,m) Hàm Lấy chuỗi từ S, vị trí n với m ký tự Insert(s1,S,n) Thủ tục Chèn s1 vào s vị trí n
Val(s,x,k) Thủ tục Chuyển chuỗi số s thành số x Delete(s,n,m) Thủ tục Xoá chuỗi s từ vị trí n , m ký tự
2.Tìm kiếm chuỗi (ký tự, từ, chuỗi con) Vấn đề:
Cấu trúc chung
+ Viết hàm kiểm tra điều kiện
+ Lặp từ đầu chuỗi cuối chuỗi chuỗi thoả điều kiện
Ví dụ 1: Viết chương trình nhập vào chuỗi S, cho biết chuỗi S có loại ký tự
+ chuỗi ký tự xét xetS:=’’; dem:=0; + Lặp từ đến số phần tử chuỗi
(24)Dem:=dem+1; setS:=xetS+kýtư
Ví dụ 2: Một từ mẫu tự liền Viết chương trình nhập vào chuỗi cho biết chuỗi có từ
+ Lặp từ đầu chuỗi đến cuối chuỗi
Nếu ký tự thuộ tập ‘a’ ’z’ độ dài đoạn tăng
Còn độ dài đoạn lớn đếm tắng độ dài đoạn
Bài tập
Bài 1: Viết chương trình nhập vào chuỗi S gồm chữ số 0,1 ,9 mẫu tự a,b z Hãy tìm đoạn S gồm mẫu tự liên tiếp dài
Bài 2: Một từ mẫu tự liền Viết chương trình nhập vào chuỗi S Hãy tìm từ dài chuỗi
Bài 3: Viết chương trình nhập vào chuỗi S gồm mẫu tự Hãy tìm đoạn ký mẫu tự liên tiến dài chuỗi bảo đảm thứ tự a,b,c
3.Biến đổi chuỗi
Vấn đề: Cho qui tắt biến đổi chuỗi, xác định chuỗi kết sau biến đổi
Cấu trúc chung
+ Tìm quy luật chung qui tắc biến đổi ( Các trường hợp chung riêng)
+ Lặp với số lần áp dụng qui tắc Thực biến đổi số
(25)Do chuỗi kết thúc ký tự a liền đầu, đến ký tự b liền nhau, đến ký tự c liền cuối khoảng trắng
Ta gọi số ký tự a na , số ký tự b nb, số ký tự c nc độ dài chuỗi na+nb+nc+1 Khi ký tự a vị trí từ na, ký tự b vị trí từ na+1na+nb, ký tự c có vị trí na+nb+1 na+nb+nc
Để số lần đổi chổ ta chuyển ký tự sai vị trí vị trí chuỗi kết thúc Như ban đầu (cuối chuỗi) ta chuyển ký tự sai vị trí khoảng trắng khoảng trắng không cuối dãy ta chuyển phần tử sai vị trí khoảng trắng vị trí
Bài tập
Bài 1: Cho chuỗi có n ký tự khác nhau, số k nguyên dương (k<n) Người ta biến đổi chuỗi sau: Đầu tiên từ đầu chuỗi đếm k bỏ ký tự vị trí k khỏi chuỗi, đếm ký tự lại từ hết chuỗi đếm tiếp từ đầu chuỗi k bỏ ký tự vị trí k khỏi chuỗi, tiếp tục chịn ký tự Viết chương trình nhập vào số nguyến dương n, k cho biết vị trí ban đầu ký tự lại thực biến đổi