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

Tìm chữ số đầu tiên của tích mảng C++


Cho mảng số nguyên, tìm chữ số hàng chục ngàn... (chữ số đầu tiên) của tích tất cả phần tử.

Ví dụ

arr = {12, 43, 32, 54} → Tích = 887,808 → Chữ số đầu = 8

Cách 1: Tính tích trực tiếp (chỉ dùng cho mảng nhỏ, tích không tràn)

int firstDigitProduct(vector arr) {
    long long prod = 1;
    for (long long x : arr) prod *= x;
    while (prod >= 10) prod /= 10;
    return (int)prod;
}

Cách 2: Dùng log10 (tránh tràn số, O(n))

log10(prod) = Σ log10(a[i]). Phần thập phân quyết định chữ số đầu.

int firstDigitProductLog(const vector& arr) {
    double logSum = 0;
    for (int x : arr) logSum += log10(x);
    double fractional = logSum - floor(logSum);
    return (int)pow(10, fractional);
}

Chương trình hoàn chỉnh

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

int main() {
    vector arr = {12, 43, 32, 54};
    
    // Cách 1
    long long prod = 1;
    for (int x : arr) prod *= x;
    int d1 = prod;
    while (d1 >= 10) d1 /= 10;
    
    // Cách 2
    double logSum = 0;
    for (int x : arr) logSum += log10(x);
    int d2 = (int)pow(10, logSum - floor(logSum));
    
    cout << "Tich: " << prod << "\n";
    cout << "Chu so dau (cach 1): " << d1 << "\n";
    cout << "Chu so dau (cach 2): " << d2 << "\n";
    return 0;
}

Kết quả

Tich: 887808
Chu so dau (cach 1): 8
Chu so dau (cach 2): 8