Pascal
Có một tin nhắn được mã hóa và giấu trong một xâu văn bản trc khi gửi đi.Quy tắc mã hóa tin nhắn là thay đổi mỗi chữ cái trong tin nhắn thành một chữ cái đứng cách nó k vị trí trong bảng chữ cái tiếng anh (A-Z / 1- 26) theo quy tắc xoay vòng,các ký tự k phải chữ cái thì k thay đổi .Trong xâu có thể có nhiều tin nhắn ,giữa các tin nhắn được ngăn cách nhau bởi dấu #.Biết rằng tin nhắn có độ dài lớn nhất là tin nhắn cần tìm.Nếu có nhiều tin nhắn có cùng chiều dài thì tin nhắn đầu tiên tìm thấy là tin nhắn cần giải mã
Yêu cầu:Cho trc 1 xâu S dài k quá 255 ký tự và một số nguyên dương k.Hãy tìm và giải mã tin nhắn được giấu trong xâu S
Dữ liệu:Nhập vào từ bàn phím 2 dòng là xâu S và số nguyên dương k
VD Bàn phím Màn hình
ABC#QBTDBM#123HGF 2
1 Pascal
program oken;
uses crt;
type gion_han = 1..26;
var s: string;
k: gion_han;
i,j,dem,dem2,max,vt: byte;
l: array [1..255] of byte;
begin
clrscr;
write(‘Nhap xau(viet hoa neu la chu cai va cuoi xau phai co dau #): ‘); readln(s);
write(‘Nhap so k(chi duoc nhap tu so 1->26): ‘); readln(k);
dem:=0; dem2:=0; j:=0;
for i:=1 to length(s) do
if (s[i] = ‘#’) then
begin
j:=j+1;
if j=1 then
l[j]:=i-1;
if j>=2 then
l[j]:= i-j-l[j-1];
end;
max:=l[1]; vt:=1;
for i:=j downto 2 do
if l[i]>= max then
begin
max:=l[i];
vt:=i;
end;
for i:=1 to length(s) do
if (s[i] = ‘#’) then
begin
dem:=dem+1;
if dem=vt then
for j:=(i-1) downto (i-max) do
if (s[j] in [‘A’..’Z’]) then
if (ord(s[j]) = (k+64)) then
dem2:=dem2+1;
end;
writeln(‘So lan xuat hien: ‘,dem2);
readln;
end.
uses crt;
var t,s,m:string; k,n,i:longint;
begin
clrscr;
write(‘S=’);readln(s);
write(‘k=’);readln(k);
n:=length(s);
for i:=1 to n+1 do
if (s[i]<>’#’)and(i<>n+1) then t:=t+s[i] else
begin
if length(t)>length(m) then m:=t; t:=”;
end;
n:=length(m);
for i:=1 to n do
if (ord(m[i])>64)and(ord(m[i])<91) then
if ord(m[i])-k<65 then write(chr(ord(91-(65-(ord(m[i])-k)))))
else write(chr(ord(m[i])-k));
readln
end.
///
Giai thich:
Cái tìm xâu dài nhất :
Là mình tách những đoạn kí tự được ngăn cách bởi # ra
-thấy cái nào dài nhất thì lấy
-mình chạy từ đầu nên sẽ lấy xâu dài nhất đàu tiên
Chổ chuyển đổi đó là:
-Mình dùng bản ascii
ORD:lấy số thứ tự của một kí tự trong bảng.
CHR:ngược lại
Ở đây có 2 trường hợp:
Từ đầu ra sau:
VD S=A k=1 thì ra Z
lấy 91-(65-ord(m[i])-k))
VD là S=A và k=1 là 65(tức là A)-1 là bằng 64
ta lấy 65-64=1
ta lấy 91-1 ra 90
chr(90)=Z
Trường hợp còn lại
Là chr(ord(m[i])-k) là ra
Nếu các bạn không hiểu hoặc code mình có sai chỗ nào thì để lại bình luận nhé
Còn cái bảng ascii là vào Tools – ascii table
Ở đay mình có 3 ví dụ: