高精度模板

打算把常见的板子敲一遍=-= 先从高精度开始吧

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
#define re register
using namespace std;
const int N=1100;
char a1[N],a2[N];
int n1[N],n2[N],ans[N],l1,nl1,l2,nl2,addn;
int main(){
	scanf("%s%s",a1+1,a2+1);
	nl1=l1=strlen(a1+1); nl2=l2=strlen(a2+1);
	for (int i=1; i<=l1; i++) n1[i]=a1[i]-'0';
	for (int i=1; i<=l2; i++) n2[i]=a2[i]-'0';
	if (l1>=l2){
		while (nl2>0){
			ans[nl1]=(n1[nl1]+n2[nl2]+addn)%10;
			if (n1[nl1]+n2[nl2]+addn>=10) addn=1;
			else addn=0;
			nl1--; nl2--;
		}
		for (int i=nl1; i>=0; i--){
			ans[i]=(n1[i]+addn)%10;
			if (n1[i]+addn>=10) addn=1;
			else addn=0;
		}
	}
	if (l1<l2){
		while (nl1>0){
			ans[nl2]=(n1[nl1]+n2[nl2]+addn)%10;
			if (n1[nl1]+n2[nl2]+addn>=10) addn=1;
			else addn=0;
			nl1--; nl2--;
		}
		for (int i=nl2; i>=0; i--){
			ans[i]=(n2[i]+addn)%10;
			if (n2[i]+addn>=10) addn=1;
			else addn=0;
		}
	}
	for (int i=((ans[0]==0)?1:0); i<=max(l1,l2); i++) printf("%d",ans[i]);
	return 0;
}

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
#define re register
using namespace std;
const int N=11000;
char a1[N],a2[N];
int n1[N],n2[N],ans[N],l1,nl1,l2,nl2;
int cmp(){
	if (l1>l2) return 1;
	if (l1<l2) return 0;
	for (int i=1; i<=l1; i++){
		if (n1[i]>n2[i]) return 1;
		if (n1[i]<n2[i]) return 0;
	}
	return -1;
}
int main(){
	scanf("%s%s",a1+1,a2+1);
	nl1=l1=strlen(a1+1); nl2=l2=strlen(a2+1);
	for (int i=1; i<=l1; i++) n1[i]=a1[i]-'0';
	for (int i=1; i<=l2; i++) n2[i]=a2[i]-'0';
	int c=cmp();
	if (c==1){
		while (nl2>0){
			if (n1[nl1]>=n2[nl2]) ans[nl1]=n1[nl1]-n2[nl2];
			else{
				int j=nl1-1;
				while (n1[j]==0){
					n1[j]=9;
					j--;
				}
				n1[j]--;
				ans[nl1]=10+n1[nl1]-n2[nl2];
			}
			nl1--; nl2--;
		}
		for (int i=nl1; i>0; i--) ans[i]=n1[i];
		int k=1;
		while (ans[k]==0) k++;
		for (int i=k; i<=l1; i++) printf("%d",ans[i]);
	}
	if (c==0){
		printf("-");
		while (nl1>0){
			if (n2[nl2]>=n1[nl1]) ans[nl2]=n2[nl2]-n1[nl1];
			else{
				int j=nl2-1;
				while (n2[j]==0){
					n2[j]=9;
					j--;
				}
				n2[j]--;
				ans[nl2]=10+n2[nl2]-n1[nl1];
			}
			nl1--; nl2--;
		}
		for (int i=nl2; i>0; i--) ans[i]=n2[i];
		int k=1;
		while (ans[k]==0) k++;
		for (int i=k; i<=l2; i++) printf("%d",ans[i]);
	}
	if (c==-1) printf("0");
	return 0;
}

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define LL long long
#define re register
using namespace std;
const int N=11000; 
char a1[N],a2[N];
int n1[N],n2[N],l1,l2,cnt,addn,ans[N][N],ans1[N];
int main(){
	scanf("%s%s",a1+1,a2+1);
	l1=strlen(a1+1); l2=strlen(a2+1);
	for (int i=1; i<=l1; i++) n1[i]=a1[i]-'0';
	for (int i=1; i<=l2; i++) n2[i]=a2[i]-'0';
	if ((l1==1 && n1[1]==0) || (l2==1 && n2[1]==0)) printf("0");
	else{
		for (int i=l2; i>0; i--){
			cnt++; addn=0;
			for (int j=l1; j>0; j--){
				ans[cnt][i+j]=(n2[i]*n1[j]+addn)%10;
				addn=(n2[i]*n1[j]+addn-(n2[i]*n1[j]+addn)%10)/10;
			}
			ans[cnt][i]=addn;
		}
		addn=0;
		for (int i=l1+l2; i>=0; i--){
			int a=0;
			for (int j=1; j<=cnt; j++){
				a+=ans[j][i];
			}
			ans1[i]=(a+addn)%10;
			addn=(a+addn-(a+addn)%10)/10;
		}
		if (addn!=0) printf("%d",addn);
		int j=0;
		while (ans1[j]==0) j++;
		for (int i=j; i<=l1+l2; i++) printf("%d",ans1[i]);
	}
	return 0;
}

写的好丑。。有时间修一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值