欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

高精度运算

程序员文章站 2024-03-19 08:16:40
...

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

加法版:

#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是倒序的
}