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(vectorarr) { 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