高精度运算模板

去年这个时候问亲爱的hfu老师NOIP考不考高精度,hfu老师满不在意地说这几年早都不怎么考了不用管。一年后的今天,只听见机房门口:“好同yue们,这个高精度,还是要去看一下,哈~~~。万一他考到了。。。”

好吧那就硬着头皮自己写模板吧。

估计即使用高精也是乘爆或者加爆long long应该不会是除法,再加上时间紧迫,先附上加减乘三种运算的模板。

codevs 3116 高精度加法

#include<cstdio> 
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define fil(a,b) memset(a,b,sizeof(a))
const int MAXN=10004;
struct None_Negative_Big_Number_Operate {
	char s[2][MAXN];
	int len[2];
	void read() {
		scanf("%s%s",s[0]+1,s[1]+1);
		len[0]=strlen(s[0]+1),len[1]=strlen(s[1]+1);
	}
	void add() {
		int a[MAXN],b[MAXN],ans[MAXN];
		fil(a,0),fil(b,0);
		int mxlen=max(len[0],len[1]);
		for (int i=1;i<=len[0];++i) a[i]=s[0][len[0]-i+1]-'0';
		for (int i=1;i<=len[1];++i)	b[i]=s[1][len[1]-i+1]-'0';
		for (int i=1;i<=mxlen;++i) {
			int temp=a[i]+b[i];
			if (temp>9) ans[i]=temp%10,++a[i+1];
			else ans[i]=temp;
		}
		if (a[mxlen+1]) printf("1");
		for (int i=mxlen;i;--i) printf("%d",ans[i]);
		puts("");
	}
}bn;
int main() {
	bn.read();
	bn.add();
	return 0;
}

codevs 3115  高精度减法

#include<cstdio> 
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define fil(a,b) memset(a,b,sizeof(a))
const int MAXN=10004;
struct None_Negative_Big_Number_Operate {
    char s[2][MAXN];
    int len[2];
    void read() {
        scanf("%s%s",s[0]+1,s[1]+1);
        len[0]=strlen(s[0]+1),len[1]=strlen(s[1]+1);
    }
    inline bool cmp() {
        if (len[0]<len[1]) return 1;
        if (len[0]>len[1]) return 0;
        for (int i=len[0];i;--i) {
            if (s[0][i]<s[1][i]) return 1;
            if (s[0][i]>s[1][i]) return 0;
        }
        return 0;
    }
    void minus() {
        int a[MAXN],b[MAXN],ans[MAXN];//x:被减数,y:减数
        fil(a,0),fil(b,0);
        for (int i=1;i<=len[0];++i) a[i]=s[0][len[0]-i+1]-'0';
        for (int i=1;i<=len[1];++i) b[i]=s[1][len[1]-i+1]-'0';
        bool bg=cmp();
        int mxlen=max(len[0],len[1]);
        for (int i=1;i<=mxlen;++i) {
            int temp;
            temp=(!bg)?a[i]-b[i]:b[i]-a[i];
            if (temp<0) ans[i]=temp+10,(!bg)?--a[i+1]:--b[i+1];
            else ans[i]=temp;
        }
        while (!ans[mxlen]&&mxlen) --mxlen;
        if (!mxlen) {puts("0");return ;}
		if (bg) printf("-");
		while (mxlen) printf("%d",ans[mxlen--]);
        puts("");
    }
}bn;
int main() {
    bn.read();
    bn.minus();
    return 0;
}

codevs 3117 高精度乘法

#include<cstdio> 
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define fil(a,b) memset(a,b,sizeof(a))
const int MAXN=10004;
struct None_Negative_Big_Number_Operate {
	char s[2][MAXN];
	int len[2];
	void read() {
		scanf("%s%s",s[0]+1,s[1]+1);
		len[0]=strlen(s[0]+1),len[1]=strlen(s[1]+1);
	}
	void multiply() {
		int a[MAXN],b[MAXN],ans[MAXN];
		fil(a,0),fil(b,0),fil(ans,0);
		for (int i=1;i<=len[0];++i) a[i]=s[0][len[0]-i+1]-'0';
		for (int i=1;i<=len[1];++i) b[i]=s[1][len[1]-i+1]-'0';
		int mxlen=len[0]+len[1];
		for (int j=1;j<=len[1];++j)
			for (int i=1;i<=len[0];++i)
				ans[i+j-1]+=a[i]*b[j];
		for (int i=1;i<=mxlen;++i)
			ans[i+1]+=ans[i]/10,ans[i]%=10;
		while (!ans[mxlen]&&mxlen) --mxlen;
		if (!mxlen) {puts("0");return ;}
		while (mxlen) printf("%d",ans[mxlen--]);
		puts("");
	}
}bn;
int main() {
	bn.read();
	bn.multiply();
	return 0;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值