theOldChun

ZJZSZX

[板子]高精(无符号)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
struct Bignum{
	#define Dignum 1000+5 
	int num[Dignum];
	#undef Dignum
};

Bignum b_trans(char *p){
	int len=strlen(p);
	Bignum ans;
	memset(ans.num,0,sizeof(ans.num));
	ans.num[0]=len;
	for(int i=len-1;i>=0;--i){
		ans.num[len-i]=p[i]-'0';
	}
	return ans;
}

void b_output(Bignum x){
	for(int i=x.num[0];i;--i){
		printf("%c",x.num[i]+'0');
	}
	return;
}

int b_cmp(Bignum a,Bignum b){
	if(a.num[0]>b.num[0]) return 1;
	if(a.num[0]<b.num[0]) return -1;
	for(int i=a.num[0];i;--i){
		if(a.num[i]>b.num[i]) return 1;
		if(a.num[i]<b.num[i]) return -1;
	}
	return 0;
}

Bignum b_add(Bignum a,Bignum b){
	Bignum ans;
	memset(ans.num,0,sizeof(ans.num));
	ans.num[0]=max(a.num[0],b.num[0]);
	int add=0;
	for(int i=1;i<=ans.num[0];++i){
		ans.num[i]+=a.num[i]+b.num[i]+add;
		add=ans.num[i]/10;
		ans.num[i]%=10;
	}
	while(add){
		++ans.num[0];
		ans.num[ans.num[0]]=add%10;
		add/=10;
	}
	return ans;
}

Bignum b_jian(Bignum a,Bignum b){
	Bignum ans;
	memset(ans.num,0,sizeof(ans.num));
	if(!b_cmp(a,b)){
		ans.num[0]=1;
		ans.num[1]=0;
		return ans;
	}
	ans.num[0]=a.num[0];
	int add=1;
	for(int i=1;i<=ans.num[0];++i){
		ans.num[i]=10+a.num[i]-b.num[i]+add-1;
		add=ans.num[i]/10;
		ans.num[i]%=10;
	}
	while(!ans.num[ans.num[0]]){
		--ans.num[0];
	}
	return ans;
}

Bignum b_mut(Bignum a,Bignum b){
	Bignum ans;
	memset(ans.num,0,sizeof(ans.num));
	for(int i=1;i<=a.num[0];++i){
		for(int j=1;j<=b.num[0];++j){
			ans.num[i+j-1]+=a.num[i]*b.num[j];
		}
	}
	ans.num[0]=a.num[0]+b.num[0]-1;
	int add=0;
	for(int i=1;i<=ans.num[0];++i){
		ans.num[i]+=add;
		add=ans.num[i]/10;
		ans.num[i]%=10;
	}
	while(add){
		++ans.num[0];
		ans.num[ans.num[0]]=add%10;
		add/=10;
	}
	while(!ans.num[ans.num[0]] && ans.num[0]>1){
		--ans.num[0];
	}
	//if(ans.num[0]==0) ans.num[0]=1;
	return ans;
}

int main(){
	//freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
	char a[10000],b[10000];
	scanf("%s",a);
	scanf("%s",b);
	Bignum x=b_trans(a);
	Bignum y=b_trans(b);
	Bignum z=b_mut(x,y);
	b_output(z);
	return 0;
}

posted on 2018-11-08 07:51  theOldChun  阅读(134)  评论(0)    收藏  举报

导航