Tỉa mảng trong pascal
Tỉa mảng : Viết chương trình nhập vào mảng n số nguyên (n < 1000). loại bỏ các phần tử trùng lặp, mỗi phần tử chỉ giữ lại một phần tử đại diện và thứ tự các phần tử không thay đổi.
Dữ liệu vào file: tia.inp | Dữ liệu ra file: tia.out |
– Dòng 1: chứa số n- Dòng 2 chứa n số cách nhau ít nhất 1 khoảng trắng | 1 dòng chứa dãy đã tỉa |
Ví dụ: Với n =10, dãy A ban đầu được nhập là:7 5 12 5 9 8 3 9 7 5 | Dãy A sau khi tỉa là:7 5 12 9 8 3 | ||||||||||||||||||||
Ý tưởng: Sử dụng một mảng “danhdau” để đánh dấu những phần tử trùng
– Đầu tiên không đánh dấu phần tử nào- Duyệt từ phần từ 1 -> n -1- Nếu chưa được đánh dấu (chưa giống phần tử nào trước đó) thì đem phần tử đó so sánh với tất cả các phần tử sau nó. Nếu gặp phần tử giống nó thì “đánh dấu” phần tử đóXuất kết quả: Duyệt qua tất cả các phần tử của mảng, phần tử nào không được đánh dấu thì xuất ra. |
Chú ý: Bài toán có thể thay cách hỏi: tỉa bỏ hết các số nguyên tố, số chính phương, …
Code 1
var i,j,n:integer; a:array[1..1000]of integer;danhdau:array[1..1000]of boolean; f:text; begin {----Doc file ----} assign(f,'tia.inp'); reset(f); readln(f,n); for i:=1 to n do read(f,a[i]); close(f); {----------danh dau phan tu trung lap--------} for i:=1 to n do danhdau[i]:=false; for i:=1 to n-1 do if danhdau[i]=false then for j:=i+1 to n do if a[j]=a[i] then danhdau[j]:=true; {----xuat ket qua-----} assign(f,'tia.out'); rewrite(f); for i:=1 to n do if danhdau[i]=false then write(f,a[i],' '); close(f); end.
Code 2
var i,j,kn:integer; a:array[1..1000]of integer;danhdau:array[1..1000]of boolean; f:text; begin {----Doc file ----} assign(f,'tia.inp'); reset(f); readln(f,n); for i:=1 to n do read(f,a[i]); close(f); {------------------} i:=2; While i <= n Do Begin j:=1; While a[j] <> a[i] Do j:=j+1; If j < i Then Begin For k:=i to n-1 Do a[k]:= a[k+1]; n:=n-1; End Else i:=i+1; End; {----xuat ket qua-----} assign(f,'tia.out'); rewrite(f); For i:=1 to n Do Write(f,a[i]:8); close(f); End.