压位高精度

有些时候,在处理很大的数字运算时,我们会用到高精度,但是,一个int本来是可以存21亿的,但我们只用了1位,浪费了大量的空间,那么我们怎么解决这个问题呢?
这时,我们就要用到一个巧妙的方法——压位高精度,即在一个格子里存2位或两位以上的数据。下面我们用乘法来举一下例子
#include<bits/stdc++.h>
using namespace std;
const int MAXN=80005;
char a[MAXN],b[MAXN];
long long shu1[MAXN],shu2[MAXN],ans[MAXN];
int main()
{
	scanf("%s",a);
	scanf("%s",b);
	int la=strlen(a),
		lb=strlen(b);
	int wei1=0,x=0;
	for(int i=la-1; i>=0; i--)
	{
		x++;
		shu1[wei1]/=10;
		shu1[wei1]+=(a[i]-'0')*10000000;
		if(x==8){
			wei1++;
			x=0;
		}
	}
	while(x%8){
		shu1[wei1]/=10;
		x++;
	}
	int wei2=0;
	x=0;
	for(int i=lb-1; i>=0; i--)
	{
		x++;
		shu2[wei2]/=10;
		shu2[wei2]+=(b[i]-'0')*10000000;
		if(x==8){
			wei2++;
			x=0;
		}
	}
	while(x%8){
		shu2[wei2]/=10;
		x++;
	}
	for(int i=0;i<=wei1;i++)
		for(int j=0;j<=wei2;j++){
			ans[i+j]+=shu1[i]*shu2[j];
			long long rest=ans[i+j]/100000000;
			ans[i+j]%=100000000;
			int wei=1;
			while(rest){
				ans[i+j+wei]+=rest;
				rest=ans[i+j+wei]/100000000;
				ans[i+j+wei]%=100000000;
				wei++;
			}
		}
	bool flag1=false,
		 flag2=false;
	for(int i=MAXN; i>=0; i--){
		if(ans[i]!=0) flag1=true;
		if(flag2){
			printf("%08lld",ans[i]);
		}
		else if(flag1){
			printf("%lld",ans[i]);
			flag2=true;
		}
	}
	return 0;
} 

可以发现,我们在代码中不再是到10就进位,而是在一个long long里存下8位数字(这里用long long是因为8位乘8位会超过int)。但这里要注意了(敲黑板),输出时我们需要进行补位,也就是当我们想要输出的是1 00000001是,压位高精度中存储的是两个1。当然不能让他输出两个1啊,所以就要补位。
这就是压位高精度的实现方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值