简单高精度加法

来源:互联网 发布:sql server2012破解版 编辑:程序博客网 时间:2024/05/17 03:39

高精度加法这里用的是字符串(数组)模拟进行的,将字符串存入数组中,a[0](a[1]也可以)是最低位,从最低位开始加,将每位相加的结果存入另一个数组中,要考虑的是进位的问题,可以依次处理每一位向前进位,最后再输出即可。

以下代码为边加边进位的方式,也可以选择先加完,最后进位。

代码如下:

#include<stdio.h>#include<string.h>#include<string>#include<iostream>#define MAXN 50001using namespace std;int main(){    void init (int x[], string chr, int len);    int add (int x[], int y[], int z[], int len);    void output (int z[], int len);    string str1, str2;    int a[MAXN]={0}, b[MAXN]={0}, z[MAXN]={0};    int l1, l2, len ,i;    cin>>str1>>str2;    l1 = str1.size();    l2 = str2.size();    init (a, str1, l1);    init (b, str2, l2);    if (l1 >= l2)    {        len = add (a, b, z, l1);    }    else    {        len = add (a, b, z, l2);    }    output (z, len);    return 0;}void init (int x[], string str, int len)    //字符串转换成数组{    int i;    for (i = 0; i <= len -1; i++)    //输入字符串从个位传入到数组中    {        x[len-1-i] = str[i] - '0';    }}int add (int x[], int y[], int z[], int len){    int i, j, r;    for (j = 0; j < len; j++)   //每一位相加    {        z[j] += x[j] + y[j];     //当前位相加        for (i = j; i < len; i++)   //判断是否需要进位        {            if (z[i] >= 10)     //当前位大于10需要进位            {                z[i+1] += z[i]/10;       //下一位获得进位的数                z[i] %= 10;     //当前位归为10以内的数                if (z[len] > 0)     //若最高位增加则长度增大                    len++;                if (z[i+1] < 10)        //若下一位小于10不需要进位则退出当前循环                    break;            }        }    }    return len;}void output (int z[], int len){    int i;    for (i = len-1; i >= 0; i--)    {        printf ("%d", z[i]);    }    printf ("\n");}