高精度运算
程序员文章站
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是倒序的
}