【AtCoder Beginner Contest 169】B Multiplication 2

题意:

给你n个数,问你这n个数之积

如果结果大于1e18就输出-1

n<=1e5

0<=数<=1e18

这种菜题我还不是一刀切

我知道长整型溢出得到负数,边乘边判断,溢出后break就vans了!

 数可能有0,最后还必须判断一下

 试验一下,好像可能会2度溢出

比如两个值为1e10的longlong相乘结果是正数

改用除法判断是否超过范围

 除之前乘积可能已经是0了,必须先判断……

 又被练了

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define LL long long
 5 int n;  LL a[110000];
 6 int main(){
 7     cin>>n;
 8     for(int i=1;i<=n;++i)  scanf("%lld",&a[i]);
 9     LL bwl=1;
10     LL cmp=1LL*1000000000*1000000000;
11     for(int i=1;i<=n;++i){
12         if(bwl==0)  break;  //attention3
13         if(cmp/bwl<a[i]){  //attention
14             bwl=-1;
15             break;
16         }
17         bwl=bwl*a[i];  //attention2
18     }
19     for(int i=1;i<=n;++i)if(a[i]==0){
20         bwl=0;
21         break;
22     }
23     cout<<bwl<<endl;
24     return 0;
25 }
View Code
原文地址:https://www.cnblogs.com/cdcq/p/13216085.html