算法
(模拟) $O(n)$
先对数组$a$进行排序,如果数组$a$中包含0,那么答案将为0,否则一路做乘法,其结果记为$ans$,当遇到大于$1e18 / ans$的数直接就输出-1
即可,并结束程序,否则一路乘到底,如果最后的$ans>1e18$则输出$-1$,否则就输出$ans$。
C++ 代码
#include <iostream>
#include <algorithm>
#define int long long
#define rep(i, n) for (int i = 0; i < n; ++i)
using namespace std;
const int N = 1e5 + 10;
const int INF = 1e+18;
int n;
int a[N];
signed main() {
cin >> n;
rep(i, n) cin >> a[i];
sort(a, a + n);
int ans = 1;
rep(i, n) {
if (a[i] > INF / ans) {
cout << "-1\n";
return 0;
}
ans *= a[i];
if (!ans) break;
}
if (ans > INF) cout << "-1\n";
else cout << ans << '\n';
return 0;
}