高精度运算

博客介绍了高精度运算,即使用数组存放一个大数,通过操作模拟加减乘除运算,包含加法、减法、乘法、除法以及大数相乘版本,还提到减法中x要比ans小,除法中除数sum需倒序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高精度是指用数组存放一个大数,然后用用一些操作来模拟加减乘除的运算

加法版:

#include<bits/stdc++.h> 
#define M 100005
#define lom long long
using namespace std;
int ans[M],len_a=1;
void puls(lom x)
{
	ans[1]+=x;
	int i=1;
	int temp=0;
	for(int i = 1; i <= len_a; i++)//进位 
    {
        temp += ans[i];
        ans[i] = temp %10;
        temp /= 10;
        if(temp==0) break;//如果进位后是个位数 
    }
	while(temp!=0)//如果还需要进位 
	{
		ans[++len_a]=temp%10;
		temp/=10;
	}
}//倒序 

减法版:(x一定要比ans小)

#include<bits/stdc++.h> 
#define M 100005
#define lom long long
using namespace std;
int ans[M]={0,4,5,6,7,8,9},len_a=6;
void subt(lom x)//ans减去x存放到ans里 
{
	int temp=x;
	for(int i=1;i<=len_a;i++)
	{
		if(temp==0) break;
		if(ans[i]<(temp%10))
		{
			ans[i]=10+ans[i]-(temp%10);
			ans[i+1]--;
		}
		else	ans[i]-=(temp%10);
		temp/=10;
	}
	if(ans[len_a]==0) len_a=1;//防止全是零的情况 
} 

乘法版:

#include<bits/stdc++.h> 
#define M 100005
#define lom long long
using namespace std;
int ans[M]={0,1},len=1;
//定义存放答案的数组,并使a[1]初始化为1,长度为ls 
void muti(lom x)//将ans里面的数乘以x存放在ans里面 
{
	int temp=0;
	for(int i=1;i<=len;i++) ans[i]*=x;//时每一位数都乘以x
	
	for(int i=1;i<=len;i++)//进位,使得每个数组元素只有一个个位数 
	{
		temp+=ans[i];
		ans[i]=temp%10;
		temp/=10;
	} 
	
	while(temp!=0)//把剩下的数放到最低位 
	{
		ans[++len]=temp%10;
		temp/=10;
	}
	//此时数组是反着放的
}

除法版:

注意除数sum也必须是倒序的

#include<bits/stdc++.h> 
#define M 100005
#define lom long long
using namespace std;
int ans[M],sum[M],len_a,len_s;
//定义存放答案的数组,长度为ls 
void divi(lom x)//将sum里面的数除以x存放到ans里面,向下取整 
{
	memset(ans,0,sizeof(ans));//清空 ans 
	len_a=len_s;
	int temp=0;
	for(int i=len_a;i>=1;i--)
	{
		temp*=10;
		temp+=sum[i];//取前几位数组成一个整数 
		if(temp>=x)//如果能相除 
		{
			ans[i]=temp/x;
			temp%=x;
		}
	}
	while(ans[len_a]==0&&len_a!=1) len_a--;//去掉前导零
	//此时ans是倒序的
}

大数相乘版:

#include<bits/stdc++.h>
#define M 100005
#define lom long long
using namespace std;
lom ans[M]={1,1},k[M]={1,2},c[M];
void muti(lom a[],lom b[])
{
	memset(c,0,sizeof(c)); c[0]=a[0]+b[0];
	
    if(c[0]>500) c[0]=500;
    
    for(int i=1;i<=b[0];i++)//模拟乘法 
	for(int j=1;j<=a[0];j++)
	{
		c[j+i-1]+=b[i]*a[j];
		if(c[j+i-1]>9)
		{
			c[i+j]+=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	}
    
    for(int i=0;i<=c[0];i++) a[i]=c[i];
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值