B - Multiplication 2 (大数乘法)

B - Multiplication 2 (大数乘法)

传送门

思路:看到高精度,首先就想到用 p y t h o n python python。及其舒适。然后说说 C + + C++ C++的做法。可以直接用高精度模板,但是太麻烦了。。

首先需要特判一下是否有 0 0 0。若有 0 0 0直接输出 0 0 0.(避免之前乘积大于 1 e 18 1e18 1e18但后面有0)

然后因为当 a ∗ b > 1 e 18 →   a > d o u b l e ( 1 e 18 b ) a*b>1e18\rightarrow \ a>double(\dfrac{1e18}{b}) ab>1e18 a>double(b1e18)不满足条件。

所以只需判断 a > d o u b l e ( 1 e 18 b ) > ⌊ 1 e 18 b ⌋ a>double(\dfrac{1e18}{b})>\lfloor\dfrac{1e18}{b}\rfloor a>double(b1e18)>b1e18

又因为 a , b a,b a,b为整数,所以当 a > ⌊ 1 e 18 b ⌋ a>\lfloor\dfrac{1e18}{b}\rfloor a>b1e18时, a a a一定 > d o u b l e ( 1 e 18 b ) >double(\dfrac{1e18}{b}) >double(b1e18)

e p : 5 > 4 → 5 > 4.5 ep:5>4\rightarrow 5>4.5 ep:5>45>4.5

这样就巧妙地避开了乘法。

貌似还有用 d o u b l e double double也能过。但是只能每次都要判断一下。不能乘完再判断。否则会爆掉。但是由于数据太弱,貌似怎么写都能过。用 d o u b l e double double写的时候,注意 d o u b l e double double精度会有缺失,应该用两个数都判断一下。。不提倡用 d o u b l e double double

甚至 _   i n t 128 \__\ int128 _ int128都能过。。

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
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;
}

d o u b l e double double代码:

#include
#include
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;
}

i n t 128 int128 int128

#include
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;
}

你可能感兴趣的:(高精度)