Bài toán loại bỏ phần tử trùng nhau pascal năm 2024

Trong quá trình giải quyết các bài toán ôn thi HSG pascal các bạn rất hay gặp những bài toán liên quan đến tỉa mảng chẳng hạn

  1. Xóa bỏ những số nguyên tố trong mảng một chiều
  2. Tìm và loại bỏ những số chính phương trong mảng
  3. Xuất ra những số trong mảng chia hết cho 3
  4. Loại bỏ những phần tử trùng nhau trong mảng, mỗi phần tử chỉ xuất hiện một lần

Có nhiều cách để giải quyết các bài toán dạng này. Cách mà các bạn hay dùng đó là tìm phần tử cần loại bỏ sau đó loại nó đi bằng cách dồn các phần tử của mảng phía sau phần tử loại đi lên.

Tuy nhiên cách làm trên thường làm mất vị trí của mảng ban đầu do các phần tử bị dồn lại.

Mình chia sẻ với các bạn một cách làm khác đó là kỹ thuật dùng mảng đánh dấu để đánh đấu những phần tử cần loại và sau đó chỉ xuất ra những phần tử không được đánh dấu.

Để cho dễ hiểu mình sẽ minh họa cho bài tập sau:

“Viết chương trình loại bỏ những số nguyên tố trong mảng n phần tử, xuất ra kết quả là mảng sau khi đã bỏ đi các số nguyên tố và vị trí của các số nguyên tố đã bị bỏ đi trong mảng ban đầu “

Ta lấy ví dụ có dãy số được lưu trong mảng a như trên, trong đó có 2 số nguyên tố là 2 và 5

Ta sử dụng một mảng đánh dấu d mà các phần tử chỉ nhận hai giá trị 0 hay 1 [các bạn cũng có thể chọn kiểu dữ liệu cho mảng đánh dấu này là boolean chỉ nhận hai giá trị true và false cho tiết kiệm bộ nhớ]

Đây cũng là một code để xóa các phần tử giống nhau trong mảng, có điều đúng hơn là xóa các giá trị trùng nhau nhưng vẫn đảm bảo vị trí của mảng. Theo mình nghĩ thì vẫn đúng, nhưng thừa thôi

Last edited: 10 Tháng chín 2019

  • 4

    Bài 1: Xóa các phần tử trùng nhau trong mảng một chiều Đọc vào mảng một chiều gồm 1 dãy số nguyên có n phần tử. Hãy xóa các phần tử trùng nhau trong mảng và in kết quả ra màn hình. Giúp mình nhé! Mình cảm ơn!

Mã:

var i,n,j:longint;
    a,b:array[1..100] of longint;
begin
      writeln['nhap n:'];readln[n];
      for i:= 1 to n do
      begin
            writeln['nhap phan tu a[,',i,']'];
            readln[a[i]];
            b[a[i]]:= b[a[i]]+1;
      end;
      i:=1;
      while i1 then
            begin
                 for j:= i to n do a[j]:= a[j+1];
                 n:= n-1;
            end else i:= i+1;
      end;
      writeln['cac phan tu con lai la:'];
      for i:= 1 to n do write[a[i],' '];
end.

vì bạn không nói còn chừa lại một số hay xóa hết nên mình chọn là xóa hết luôn nha và không có giới hạn phạm vi số nên cái này chỉ có phần dương thôi

Nhập vào mảng 1 chiều gồm 1 dãy số nguyên N phần tử. Hãy xóa các phần tử trùng nhau trong mảng và in kết quả ra màn hình. Ý tưởng: Duyệt mảng 1 chiều bằng 2 biến, nếu phát phát hiện phần tử nào trùng thì xóa phần tử ấy ra khỏi mảng.

Program Bo_so_trung; Const Max=100; Var a:Array[1..Max] Of Integer; i,j,k,n:Integer; Begin Writeln['XOA BO CAC SO TRUNG NHAU']; Writeln['----']; Writeln; Write['-Nhap so phan tu mang: ']; Readln[n]; For i:=1 To N Do Begin Write['-Phan tu A[',i,']= ']; Readln[a[i]]; End; i:=2; While i

Chủ Đề