B - Multiplication 2 (大数乘法)
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;
} 

 美的集团公司福利 727人发布
美的集团公司福利 727人发布