高精度算法--入门

来源:互联网 发布:狼人杀 官方唯一 知乎 编辑:程序博客网 时间:2024/06/01 08:00

高精度算法是基础算法中比较实用的算法之一,它主要应用于大数之间的运算。
(主要是在超过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~~~~~~~~~~~~~~~~~

1 0
原创粉丝点击