Một số bài tập hay về vòng lặp và mảng 1 chiều

dailuong

New member
Xu
0
Một số bài tập mà mình sưu tầm được. Mọi người cùng vào thảo luận thuật toán, ai code rồi thì up lên cho mọi người cùng tham khảo nha :D
1. Tìm số lớn thứ 2 xuất hiện trong mảng.
2. Tìm số lớn nhất và nhỏ nhất thuộc đoạn [x;y] và thuộc mảng a. (x và y là và mảng a thuộc kiểu số nguyên)
3. Tìm số dương nhỏ nhất và số âm lớn nhất trong mảng
4. In ra tổng lớn nhất của k phần tử liên tiếp xuất hiện trong mảng
5. In ra màn hình phần tử xuất hiện nhiều lần nhất trong mảng
6. Đếm số lượng các phần tử khác nhau trong mảng
7. Cho mảng a theo thứ tự sau: a[1] -> a[m-1] -> a[m] -> a[n]
Viết chương trình đảo vị trí các phần tử trong mảng thành: a[m] -> a[n] -> a[1] -> a[m-1]
Yêu cầu: Không sử dụng thêm mảng phụ
8. Sắp xếp lại mảng sao cho các số chẵn tăng dần ở đầu mảng, các số lẻ giảm dần ở cuối mảng.
9. Cho 2 mảng 1 chiều đã xắp xếp tăng dần,
Viết chương trình nhập 2 mảng thành 1 mảng tăng dần
10. Cho 2 mảng 1 chiều.
Viết chương trình in ra màn hình tất cả các số cùng xuất hiện trên cả 2 mảng (trong mỗi mảng vẫn có thể có những phần tử có giá trị trùng nhau)
11. Viết chương trình tính tổng a + b (Với a và b là những số vô cùng lớn, không thể lưu vào các kiểu dữ liệu thông thường)
 
trước tiên mình xin giải bài 10 heng(bài dễ nhất), không sử dụng chương trình con:

uses crt;
const max=100;
var a:array[1..max] of integer;
b:array[1..max] of integer;
i,j,n,m:integer;
begin
clrscr;
writeln;
repeat;
write('nhap so phan tu mang n,m= ');
readln(n,m);
until n<m;
for i:=1 to n do
begin
write('nhap a[',i,']= ');
readln(a);
end;
for i:=1 to m do
begin
write('nhap b[',i,']= ');
readln(b);
end;
for i:=1 to n do
for j:=1 to m do
begin
if a=b[j] then write(a:2);
end;
readln;
end.
 
Bài này bạn phải ép số phần tử của mảng a nhiều hơn mảng b nhưng nếu trong trường hợp dữ liệu cho ở kiểu file thì mình khó có thể sử dụng được kiểu này.
Bài này mình để xuất 2 thuật toán (mình cũng chưa thoả mản với 2 thuật toán này vì nó tốn nhiều thời gian và độ phức tạp cao)
Thuật toán 1: Mình sẽ sắp xếp 2 mảng rồi duyệt tuần tự song song cả 2 mảng để tìm những phần tử giống nhau
Thuật toán 2: Dùng thuật toán đánh dấu.
Mình sẽ tạo ra 2 mảng phụ a1 va b1có kiểu boolean. Mảng 1 đánh dấu các phần tử của a1[a]=1; b1[b]=1.
Duyệt a,b để tìm ra phần tử chung (a=b=1)
Phép duyệt mảng bool sẽ nhanh hơn và chiếm ít bộ nhớ hơn.
Mọi người cùng thảo luận để tìm ra thuật toán hay hơn nha
 
mình xin giải bài 3:
uses crt;
const max=100;
var a,b,c:aray[1..max] of integer;
i,j,n:integer;
begin
clrscr;
write('nhap so phan tu mang n= ');
readln(n);
for i:=1 to n do
begin
write('a[',i,']= ');
readln(a);
end;
for i:=1 to n do
if a<0 then b:=a else c:=a;
{tới đây thì bạn so sánh là xong};
readln;
end.
nếu bạn nào có thuật toán toán hay hơn, xin post lên cho mình học hỏi
 
Cách giải của mình nè (mình không dùng mảng phụ)
uses crt;
const max=100;
var a,b,c:aray[1..max] of integer;
i,j,n,m1,m2:integer;
begin
clrscr;
write('nhap so phan tu mang n= ');
readln(n);
for i:=1 to n do
begin
write('a[',i,']= ');
readln(a);
end;
m1:=0; //max so am
m2:=0; //min so duong
for i=1 to n do
begin
if (a<0 & (a>m1 hoac m1=0)) then m1:=a;
if (a>0 & (a<m2 hoac m2=0)) then m2:=a;
end;
readln;
end.

Nhờ mấy mod sửa lại lỗi cú pháp hộ em nha. Lâu rồi không học pas nên quên hết cú pháp rồi :)
 

Trending content

VnKienthuc lúc này

Không có thành viên trực tuyến.

Định hướng

Diễn đàn VnKienthuc.com là nơi thảo luận và chia sẻ về mọi kiến thức hữu ích trong học tập và cuộc sống, khởi nghiệp, kinh doanh,...
Top