AtCoder Beginner Contest 169 比赛人数11374 比赛开始后15分钟看到A题,在比赛开始后第20分钟看到所有题
AtCoder Beginner Contest 169 B Multiplication 2 long long竟然不够用
总目录详见https://blog.csdn.net/mrcrack/article/details/104454762
在线测评地址https://atcoder.jp/contests/abc169/tasks/abc169_b
long long竟然不够用,那么两种情况
1.读入数组中有数值为0的情况,那么直接输出0,可将数组元素自小到大排序,若a[1]==0,直接输出0.
2.计算过程中,long long确实不够用,如ans*a[i]>10^18怎么办?可以这样判定a[i]>10^18/ans
这样能保证a[i],10^18/ans都在long long范畴。
注意
#define num (LL)1000000000000000000
这个宏定义正确
#define num 1e18
这个宏定义错误,因1e18是浮点数,在整数计算中存在误差,无法AC.
AC代码如下
#include <cstdio>
#include <algorithm>
#define LL long long
#define num (LL)1000000000000000000
using namespace std;
LL a[100010];
int main(){
int n,i;
LL ans=1;
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+1+n);
if(a[1]==0){printf("0\n");return 0;}
for(i=1;i<=n;i++)
if(a[i]>num/ans){printf("-1\n");return 0;}
else ans*=a[i];
printf("%lld\n",ans);
return 0;
}