题目描述
给出N个整数A_1,...,A_NA1,...,AN ,请你计算A_1×...×A_NA1×...×AN的值。如果计算结果超过10^{18}1018 ,则输出-1。
约束条件:
2≤N≤10^52≤N≤105
0≤A_i≤10^{18}0≤Ai≤1018
输入的所有值都是整数。输入格式
第一行是一个整数N。
第二行是N个整数A_1......A_NA1......AN 。相邻两个整数之间用一个空格隔开。输出格式
输出A_1×...×A_NA1×...×AN的值,如果计算结果超过10^{18}1018 ,则输出-1。
本题有两种解题思路,一是用高精度,二是利用乘法和除法的巧妙转化求解
但做题的时候虽然明白用正常乘法计算会超过long long 类型
如上文所说用普通的程序自带的乘法运算是坑定行不通的,所以只等另寻它法
从题目中提炼出了判断条件即 sum<1e18 才能继续,否则直接输出-1;(若有一个数是0,则直接输出0)
若每次输入的一个乘数为a,那么就有a*sum<1e18,那么很有可能a*sum的值已经超出了long long的范围,但是如果利用不等式的性质,把a除到等式的右边,那么就一定不会超出long long 了(因为每个数都在long long 范围内)
则有 sum<1e18/a
#include<bits/stdc++.h>
using namespace std;
long long a,sum=1;
int n;
const long long maxn=1e18;
int main()
{
cin>>n;
int flag=0;
for(int i=1;i<=n;i++)
{
cin>>a;
if(a==0)
{
cout<<"0";
return 0;
}
if(sum>maxn/a)
{
flag=1;//万一后面输入的数有零
}
else {
sum*=a;
}
}
if(flag==1) cout<<"-1";
else cout<<sum;
return 0;
}
这种方法很巧妙,很值得学习
还要多练习啊