B - Multiplication 2 (大数乘法)
思路:看到高精度,首先就想到用。及其舒适。然后说说的做法。可以直接用高精度模板,但是太麻烦了。。
首先需要特判一下是否有。若有直接输出.(避免之前乘积大于但后面有0)
然后因为当不满足条件。
所以只需判断。
又因为为整数,所以当时,一定
这样就巧妙地避开了乘法。
貌似还有用也能过。但是只能每次都要判断一下。不能乘完再判断。否则会爆掉。但是由于数据太弱,貌似怎么写都能过。用写地时候,注意精度会有缺失,应该用两个数都判断一下。。不提倡用
甚至都能过。。
Python代码
n = int(input()) a = list( map (int , input().split() ) ) a.sort() ans = 1 for i in range(n): ans*=a[i] if ans>10**18: print(-1) exit() print(ans)
C++代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; ll a[N],x=1e18; long long ans=1; int main(){ int n,f=0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); if(!a[i]) f=1; } if(f) puts("0"),exit(0); for(int i=1;i<=n;i++){ if(a[i]>(x/ans)){ puts("-1"); exit(0); } else ans*=a[i]; } printf("%lld\n",ans); return 0; }
代码:
#include<cstdio> #include<iostream> using namespace std; typedef long long ll; const int N=1e5+5; int main(){ int n; scanf("%d",&n); ll ans=1,y=1e18; double tmp=1; for(int i=1;i<=n;i++){ ll x; scanf("%lld",&x); ans=ans*x; tmp=tmp*x; } if(ans>y||tmp>y) puts("-1"); else printf("%lld\n",ans); return 0; }
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; ll a[N],x=1e18; long long ans=1; int main(){ int n,f=0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); if(!a[i]) f=1; } if(f) puts("0"),exit(0); for(int i=1;i<=n;i++){ if((__int128)ans*a[i]>x){ puts("-1"); exit(0); } else ans*=a[i]; } printf("%lld\n",ans); return 0; }