Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chia từng phần tử mảng này cho tích các phần tử mảng kia trong C++

Giới thiệu

Cho hai mảng arr1 và arr2. Tính tích của tất cả phần tử trong arr2 (bỏ qua số 0), sau đó chia từng phần tử của arr1 cho tích này.

Ví dụ

arr1 = {32, 22, 4, 55, 6}

arr2 = {1, 2, 3}

Tích arr2 = 1 × 2 × 3 = 6

Kết quả: {32/6, 22/6, 4/6, 55/6, 6/6} = {5, 3, 0, 9, 1} (chia nguyên)

Mã nguồn hoàn chỉnh

#include <bits/stdc++.h>
using namespace std;

void divideArrOneWithTwo(int arr_one[], int arr_two[], int n, int m) {
    // Tính tích các phần tử của mảng 2 (bỏ qua 0)
    long long product = 1;
    for (int i = 0; i < m; i++) {
        if (arr_two[i] != 0) {
            product *= arr_two[i];
        }
    }
    
    // Chia từng phần tử mảng 1 cho tích
    for (int i = 0; i < n; i++) {
        cout << (arr_one[i] / product) << " ";
    }
    cout << endl;
}

int main() {
    int arr_one[] = {32, 22, 4, 55, 6};
    int arr_two[] = {1, 2, 3};
    int n = sizeof(arr_one) / sizeof(arr_one[0]);
    int m = sizeof(arr_two) / sizeof(arr_two[0]);
    
    divideArrOneWithTwo(arr_one, arr_two, n, m);
    return 0;
}

Kết quả chạy chương trình

5 3 0 9 1

Phân tích độ phức tạp

  • Thời gian: O(n + m) - duyệt qua hai mảng
  • Không gian: O(1)

Các lưu ý quan trọng

1. Xử lý số 0 trong mảng 2

Code bỏ qua số 0 khi tính tích. Nếu mảng 2 chứa 0, tích thực sự = 0, chia cho 0 sẽ lỗi. Cách xử lý này giả định ý đồ là bỏ qua 0.

2. Tràn số (Overflow)

Tích có thể rất lớn. Nên dùng long long hoặc kiểm tra tràn:

if (product > LLONG_MAX / arr_two[i]) {
    // Xử lý tràn số
}

3. Chia nguyên vs Chia thực

Code dùng chia nguyên (truncation). Nếu cần chia thực:

cout << fixed << setprecision(2) << (double)arr_one[i] / product;

Kết luận

Bài toán đơn giản minh họa kỹ thuật tiền tính giá trị chung (tích mảng 2) để tránh tính toán lặp lại, tối ưu hiệu năng.