Cho mảng chứa các phần tử trùng lặp, nhiệm vụ là tìm tích của tất cả các phần tử không trùng lặp hoặc distinct trong mảng cho trước và hiển thị kết quả.
Ví dụ
Đầu vào: arr[] = {2, 1, 1, 2, 3, 4, 5, 5}
Đầu ra: 120
Giải thích: Vì 1, 2, 5 lặp lại nhiều hơn 1 lần nên chỉ xét lần xuất hiện đầu tiên. Kết quả: 1 * 2 * 3 * 4 * 5 = 120
Đầu vào: arr[] = {1, 10, 9, 4, 2, 10, 10, 45, 4}
Đầu ra: 32400
Giải thích: Vì 10 và 4 lặp lại nhiều lần nên chỉ xét lần đầu. Kết quả: 1 * 10 * 9 * 4 * 2 * 45 = 32400
Cách tiếp cận dùng trong chương trình dưới –
- Nhập các phần tử trùng lặp vào mảng
- Để cách tiếp cận tốt hơn, sắp xếp các phần tử mảng theo thứ tự tăng dần để dễ xác định phần tử nào lặp lại và không tính nó vào tích
- Tìm tất cả các phần tử distinct trong mảng và nhân liên tục chúng bằng cách lưu kết quả
- Hiển thị kết quả cuối cùng là tích tất cả phần tử distinct trong mảng
Thuật toán
Bắt đầu
Bước 1 -> Khai báo hàm tìm tích tất cả phần tử distinct trong mảng
int find_Product(int arr[], int size)
Khai báo và gán int prod = 1
Tạo biến unordered_set s
Vòng lặp Với i = 0 đến i < size và i++
NẾU s.find(arr[i]) == s.end()
Gán prod *= arr[i]
Gọi s.insert(arr[i])
Kết thúc
Kết thúc
trả về prod
Bước 2 -> Trong main()
Khai báo và gán int arr[] = {2, 1, 1, 2, 3, 4, 5, 5}
Tính kích thước mảng int size = sizeof(arr) / sizeof(int)
Gọi find_Product(arr, size)
Kết thúc
Ví dụ mã C++
#include <bits/stdc++.h>
using namespace std;
// Hàm tính tích phần tử không lặp lại
int find_Product(int arr[], int size) {
int prod = 1;
unordered_set<int> s;
for (int i = 0; i < size; i++) {
if (s.find(arr[i]) == s.end()) {
prod *= arr[i];
s.insert(arr[i]);
}
}
return prod;
}
int main() {
int arr[] = {2, 1, 1, 2, 3, 4, 5, 5};
int size = sizeof(arr) / sizeof(int);
cout<<"tích tất cả phần tử không lặp lại là: "<<find_Product(arr, size);
return 0;
}
Đầu ra
tích tất cả phần tử không lặp lại là: 120