Bài 1: Cho 2 dãy số thực a1,a2,a3,…,an (1) ; b1,b2,b3,…,bm (2). Dãy (1) được gọi là dãy con của dãy 2 nếu bỏ đi k phần tử (k>=0) trong (2) thì có (1). Chẳng hạn: dãy 1,3,5 là dãy con của dãy 0,1,2,1,4,3,5,7. Hãy nhập vào 2 dãy và cho biết dãy (1) có phải là dãy con của dãy (2) hay không.
Bài giải:
uses crt;
type mang=array[1..100] of integer;
var a,b:mang;
n,m,i,j,h:integer;
{*****}
procedure daycon(var a,b,t:integer;c,d:mang);
var dem,i,j,l,k:integer;
begin
dem:=0;
t:=0;
for i:=1 to a do
begin
for j:=1 to b do
if c[j]=d[i] then
begin
inc(dem);
for l:=1 to a do
for k:=1 to b do
if (l<>i) and (k<>j) and (c[k]=d[l]) then
inc(dem);
end;
if dem>=a then inc(t);
dem:=0;
end;
end;
{*****}
begin
clrscr;
write('muon nhap bao nhieu so trong day 1:');readln(n);
write('Muon nhap bao nhieu so trong day 2:');readln(m);
writeln('Day 1:');
for i:=1 to n do
begin
write('nhap a[',i,']:');
readln(a[i]);
end;
writeln('Day 2:');
for i:=1 to m do
begin
write('nhap b[',i,']:');
readln(b[i]);
end;
write('Day 1:');
for i:=1 to n do write(a[i]:3);
writeln;
write('Day 2:');
for i:=1 to m do write(b[i]:3);
writeln;
if n<m then
begin
daycon(n,m,h,b,a);
if h=n then writeln('Day 1 la day con cua day 2')
else writeln('Khong day nao la day con cua day kia');
end;
if n>m then
begin
daycon(m,n,h,a,b);
if h=n then writeln('Day 2 la day con cua day 1')
else writeln('Khong day nao la day con cua day kia');
end;
readln;
end.
Bài 2: “Dãy đoạn con” tương tự dãy con nhưng các phần tử liên tiếp. Chẳng hạn: dãy 1,2,1 là dãy đoạn con của dãy 0,1,2,1,4,5,6,3. Còn dãy 1,4,6 không là dãy đoạn con của nó. Hãy nhập vào 2 dãy và cho biết dãy (1) có phải là dãy đoạn con không.
Bài giải:
uses crt;
type mang=array[1..100] of integer;
var a,b:mang;
n,m,i,j,h:integer;
{-----------}
procedure daycon(var a,b,k:integer;c,d:mang);
var dem,i,j,t,p:longint;
begin
dem:=0;
t:=0;
for i:=1 to a do t:=t*10+d[i];
for i:=1 to b do
begin
for j:=i to b do
begin
p:=p*10+c[j];
if p=t then inc(dem);
end;
if dem<>0 then inc(k);
p:=0;dem:=0;
end;
end;
{-----------------------}
begin
clrscr;
write('muon nhap bao nhieu so trong day 1:');readln(n);
write('Muon nhap bao nhieu so trong day 2:');readln(m);
writeln('Day 1:');
for i:=1 to n do
begin
write('nhap a[',i,']:');
readln(a[i]);
end;
writeln('Day 2:');
for i:=1 to m do
begin
write('nhap b[',i,']:');
readln(b[i]);
end;
write('Day 1:');
for i:=1 to n do write(a[i]:3);
writeln;
write('Day 2:');
for i:=1 to m do write(b[i]:3);
writeln;
if n<m then
begin
daycon(n,m,h,b,a);
if h<>0 then writeln('Day 1 la day doan con cua day 2')
else writeln('Khong day nao la day doan con cua day kia');
end;
if n>m then
begin
daycon(m,n,h,a,b);
if h<>0 then writeln('Day 2 la day doan con cua day 1')
else writeln('Khong day nao la day doan con cua day kia');
end;
readln;
end.
Bài 3: Dãy được gọi là đối xứng nếu viết các phần tử của nó theo thứ tự ngược lại thì vẫn được chính nó. Dãy được gọi là khả đối xứng nếu đổi chổ các phần tử của nó thì được dãy đối xứng. Cho một dãy số nguyên, kiểm tra xem nó có khả năng đối xứng hay không? Nếu có thì biến đổi nó để được một dãy đối xứng.
Bài giải:
uses crt;
var a:array[1..100] of integer;
n,i,j,dem,t,so:integer;
{--------------}
procedure sx(var a,b:integer);
var tam:integer;
begin
tam:=a;
a:=b;
b:=tam;
end;
{-----------------}
begin
clrscr;
write('So phan tu cua day:');readln(n);
for i:=1 to n do
begin
write('nhap a[',i,']:');
readln(a[i]);
end;
writeln('Day ban dau la:');
for i:=1 to n do write(a[i]:3);
writeln;
dem:=0;
t:=0;
for j:=1 to n-1 do
for i:=j+1 to n do
if a[i]=a[j] then inc(dem);
if (dem<>0) and (dem=n div 2) then
begin
writeln('Day nay co kha doi xung');
writeln;
for i:=1 to n do
begin
for j:=1 to n do
if a[i]<>a[j] then
begin
inc(t);
if t=n-1 then so:=i;
end;
if t=n-1 then sx(a[so],a[n div 2+1]);
t:=0;
end;
for i:=1 to n-1 do
for j:=i+1 to n do
begin
if (i<so) and (a[i]=a[j]) then sx(a[j],a[n+1-i]);
if (i>so-1) and (a[i]=a[j]) then sx(a[j],a[n-i+1]);
end;
writeln('Sau khi bien doi day nhu sau:');
for i:=1 to n do write(a[i]:3);
end
else writeln('Day nay khong co kha doi xung');
readln;
end.
Bài 4: Dãy số tự nhiên a1;a2;…;ak được gọi là hạnh phúc thỏa mãn các điều kiện sau:
+) Dãy trên là một dãy giảm dần.
+) Với mọi i ai hoặc là số nguyên tố hoặc phải là ước của một trong các số a1;a2;…;ai.
Ví dụ: 8,7,5,4,3,2,1 là dãy số hạnh phúc ( với n=8 dãy số hạnh phúc có 7 phần tử).
Yêu cầu hãy viết chương trình nhập vào một số tự nhiên N từ bàn phím và in ra màn hình một dãy số hạnh phúc càng dài càng tốt với số hạng đàu tiên là N.
Bài giải:
uses crt;
type mang=array[1..100] of integer;
var a,b:mang;
i,n,k:integer;
(*****)
function snt(n:integer):boolean;
var i:integer;
begin
snt:=false;
i:=2;
while (n mod i<>0) and (i<n) do i:=i+1;
if n<>i then exit;
snt:=true;
end;
(*****)
function US(b:mang;k,i:integer):boolean;
var j,dem:integer;
begin
US:=false;
dem:=0;
for j:=1 to k do
if b[j] mod i=0 then inc(dem);
if dem=0 then exit;
US:=true;
end;
(*****)
begin
clrscr;
write('Nhap n =');readln(n);
a[1]:=n;
k:=1;
for i:=n-1 downto 1 do
if snt(i) or US(a,k,i) then
begin
k:=k+1;
a[k]:=i;
end;
writeln('Day so hanh ]phuc voi so dau tien ',n,' co ',k,' phan tu:');
for i:=1 to k do
write(a[i]:3);
readln;
end.
Bài 5: Trong một dãy số, các phần tử bằng nhau liên tiếp được gọ là 1 mặt bằng của dãy. Mặt bằng lớn nhất là mặt bằng của dãy có số phần tử nhiều nhất. Cho dãy số nguyên n. Tìm mặt bằng lớn nhất.
Bài giải:
uses crt;
var a:array[1..100] of integer;
i,n,j,vt,dem,max,tong:integer;
begin
clrscr;
tong:=0;
dem:=0;
max:=1;
write('Nhap n:');readln(n);
for i:=1 to n do
begin
write('Nhap a[',i,']:');
readln(a[i]);
end;
for j:=1 to n do
begin
for i:=j to n do
begin
tong:=tong+a[i];
dem:=dem+1;
if tong/dem=a[i] then
if dem>max then
begin
max:=dem;
vt:=j
end;
end;
tong:=0;
dem:=0;
end;
if max<>0 then
begin
writeln('Do dai cua MBLN:',max);
write('Vi tri:',vt);
end
else write('Ko co.');
readln;
end.
Bài 6: Ở một vương quốc nọ có một ông vua rất hung ác. Ông ta quyết định cho n người tự sát tập thể. Họ đứng thành một vòng tròn và người thứ m tự sát, tính thứ tự theo một chiều nào đó, chẳng hạn chiều kim đồng hồ. Khi một người ngã xuống thì vòng tròn thu hẹp lại và đếm thứ tự người còn lại bên cạnh để xác định người tự xác tiếp theo. Nhập 2 số tự nhiên n và m, liệt kê thứ tự từng người bị giêt.
VD: với n=9, m=5 thì thứ tự là: 5, 1, 7, 4, 3, 6, 9, 2, 8.
Bài giải:
uses crt;
var a:array[1..100] of integer;
n,m,i,k,t,d,j:integer;
begin
clrscr;
write('So nguoi tu sat:');readln(n);
write('Nguoi tu sat dau tien o vi tri:');readln(m);
k:=0;
d:=m-1;
writeln('Thu tu nguoi tu sat:');
for i:=1 to n do
begin
inc(k);
a[k]:=i;
end;
for i:=1 to n do
begin
write(a[m]:5);
t:=k;
k:=0;
for j:=1 to t do
if a[j]<>a[m] then
begin
inc(k);
a[k]:=a[j];
end;
if m=t then m:=1;
m:=m+d;
while (m>k) and (k<>0) do m:=m-k;
end;
readln;
end.