01/10/2018, 01:01

Bài tập mảng C++ nâng cao: In các phần tử trong 2 mảng A và B. Ae giúp đỡ?

Đề như vầy:
Nhập vào hai dãy số nguyên A 1 , A 2 , …, A n , và B 1 , B 2 , …, B m .

a) Xuất ra tập các số là hội của hai dãy A và B.

b) Xuất ra tập các số là giao của hai dãy A và B.

c) Xuất ra tập các số là hiệu của hai dãy A và B.

Ví dụ: A = {1, 2, 3, 4, 5} B = {4, 5, 6, 7, 8, 9}
a)Hội là có các phần tử của A và B: 1 2 3 4 5 6 7 8 9
b)Giao là các phần tử vừa thuộc A vừa thuộc B: 4 5
c)Hiệu là chỉ có ở A mà không có ở B: 1 2 3

=>A/e giúp nhé!

Trần Hoàn viết 03:04 ngày 01/10/2018

Thích hướng dẫn hay thích lấy code về xài =))

Thanh Chương viết 03:14 ngày 01/10/2018

Hướng dẫn đi !

Trần Hoàn viết 03:12 ngày 01/10/2018

a)
Nhập mảng A có n phần tử
Nhập mảng B có m phần tử
Tạo mảng C có n+m phần tử
Tạo biến KichThuocHoi=0

//Đưa mảng A vào đầu mảng C
for (int i=0;i<n;i++)
    {
        C[i]=A[i];
        KichThuocHoi++;
    }

//Đưa mảng B vào mảng C nối tiếp mảng A
for (int i=0;i<m;i++)
    {
        C[i+n]=B[i];
        KichThuocHoi++;
    }

//Sắp xếp dãy theo chiểu tăng dần, cái này thì vô số thuật toán, mình khỏi nói
Sắp xếp mảng C theo chiều tăng dần

//Nếu C[i] số bằng 1 số cạnh nó thì kéo cả dãy tiến lên từ vị trí đó, và giảm KichThuocHoi đi 1
for (int i=0;i<n+m-1;i++)
    if (C[i]==C[i+1])
        for (int j=i;j<n+m-1;j++)
            {
                C[j]=C[j+1];
                KichThuocHoi--;
            }

Như vậy ta có mảng C bao gồm từ C[0] đến C[KichThuocHoi-1] là hội của A và B

b)
Nếu n<m thì tạo mảng D có n phần tử, không thì mảng D có m phần tử
(Giả sử n<m hay là A có ít phần tử hơn thì ta sẽ dò theo A)

for (int i=0;i<n;i++)
    for (int j=0;i<m;j++)
        if (A[i]==B[j])
            D[i]==A[i];

Làm xong bước trên thì ta có tập D chứa giao của A và B, thực hiện sắp xếp và lọc phần tử trùng tương tự với mảng C ở câu A

c)
Tạo mảng E có kích thước n và tất cả các giá trị bằng 0;
Tạo mảng F có kích thước n và biến đếm mặc định k=0;

for (int i=0;i<n;i++)
    for (int j=0;i<m;j++)
        if (A[i]==B[j])
            E[i]=1; //Lấy những vị trí trong A mà thuộc B
for (int i=0;i<n;i++)
    if (E[i]==0)
        {
            F[k]=A[i];
            k++;
        } //Thu được F gồm các giá trị thuộc A/B và đang lộn xộn

Cuối cùng là thực hiện sắp xếp và thu gọn mảng giống câu a)

Thanh Chương viết 03:15 ngày 01/10/2018

Cảm ơn nhiều nhé !!!

Trần Hoàn viết 03:14 ngày 01/10/2018
if (C[i]==C[i+1])

Mình nhầm nhé Đoạn này dùng để loại bỏ các số trùng nhau khỏi dãy, phải thay bằng:

while (C[i]==C[i+1])
Nguyễn Xuân Phúc viết 03:10 ngày 01/10/2018

bạn học các thuật toán sắp xếp chưa?

Thanh Chương viết 03:10 ngày 01/10/2018

rồi ! !!!

viết 03:16 ngày 01/10/2018

xài set_union, set_intersection, set_difference cho khỏe, khỏi mất công rặn óc

#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
    std::vector<int> v1{1, 2, 3, 4, 5}; 
    std::vector<int> v2{         4, 5, 6, 7, 8, 9};
    
    std::sort(begin(v1), end(v1));
    std::sort(begin(v2), end(v2));
    
    std::vector<int> v1_union_v2;
    std::set_union(begin(v1), end(v1), begin(v2), end(v2),                  
                   std::back_inserter(v1_union_v2));
    for (int i : v1_union_v2) std::cout << i << ' '; std::cout << '\n';
    
    std::vector<int> v1_intersect_v2;
    std::set_intersection(begin(v1), end(v1), begin(v2), end(v2),                  
                          std::back_inserter(v1_intersect_v2));
    for (int i : v1_intersect_v2) std::cout << i << ' '; std::cout << '\n';
    
    std::vector<int> v1_minus_v2;
    std::set_difference(begin(v1), end(v1), begin(v2), end(v2),                  
                        std::back_inserter(v1_minus_v2));
    for (int i : v1_minus_v2) std::cout << i << ' '; std::cout << '\n';
}
Bài liên quan
0