高精度算法是基础算法中比较实用的算法之一,它主要应用于大数之间的运算。
(主要是在超过
longlong
范围时应用,或者两者进行运算后超过
longlong
的范围的计算。)
高精度是利用字符来存一串 或者 利用一个数组来存一个数字。
~其实像小学数学一样列一个竖式就能看懂了。。。
结构体:
struct node{
int a[10000],len;//len来记录数字的长度,a是记录具体的每一个数字
};
1.高精度的加法和减法:
加减法是利用每一个相同位相加或相减,首先找到最长的那一串,用较短的那一串来进行操作。
node jia(node x,node y)
{
if(x.len>y.len)swap(x,y);//找出短的
for(int i=1;i<=x.len;i++)
{
y.a[i]+=x.a[i];
if(y.a[i]>=10)
{
if(i==y.len)y.len++;//如果超出原来的长度
y.a[i+1]++;//10进制的性质
y.a[i]-=10;
}
}
return y;
}
2.高精度的乘法:
乘法相对来说较难,但是还是很简单~
乘法也是向小学数学那样列出了竖式。
而进位却是有点复杂。
node mult(node x,node n)
{
bigint y;
y.len=x.len;
for(int i=1;i<=x.len;i++)
{
y.a[i]+=x.a[i]*n;
int k=i;
while(y.a[k]>=10)//可能不止1进位
{
y.a[k+1]+=y.a[k]/10;
y.a[k]%=10;
k++;
y.len=max(y.len,k);//也可能长度增加
}
}
return y;
}
除法嘛。。。
不想写了。。
3.输出
简单啊!
void putout(node a)
{
for(int i=a.len;i>=1;i--)
printf("%d",a.a[i]);
puts("");
}
The end~~~~~~~~~~~~~~~~~