高精度加法

/*
Author:JustinZhang
Email:uestczhangchao@gmail.com
Time:2012年4月22日23:39:40
desc:高精度加法
*/

#include <iostream>
#include <cstring>
using namespace std;

/*
a、b为字符数组,内部存储了加数和被加数,ans用来存放最终结果,也为字符数组
*/
void arbitary_add(const char *a, const char *b,char *ans)
{
    int lena = strlen(a);
    int lenb = strlen(b);
    int maxlen = (lena > lenb) ? lena : lenb; //求得两个串长的最大者
    int *arrayA = new int [maxlen+1];
    int *arrayB = new int [maxlen+1];
    
    int *intans = new int [maxlen+1];//用来存放两个字符串的数字相加的结果
    int i=0,j=0;

    //对加法的结果数组清零
    for(i=0; i<maxlen+1; i++)
    {
        intans[i] = 0;
        arrayA[i] = 0;
        arrayB[i] = 0;
    }

    //将加数字符串中的数组取出来,放到整型数组当中,字符数组的第一个字符对应于整数的最高位.
    for(i=0; i<lena; i++)
    {
        arrayA[lena-i-1] = a[i] - '0';
    }
    //将被加数字符串中的数组取出来,放到整型数组当中,字符数组的第一个字符对应于整数的最高位.
    for(j=0; j<lenb; j++)
    {
        arrayB[lenb-j-1] = b[j] - '0';
    }
    //根据上面得到的整型数组,一位一位的做加法操作
    for(i=0; i<maxlen; i++)
    {
        intans[i] += arrayA[i]+ arrayB[i];
        
        //如果第i位的结果超过10,那么就向第i+1位进位
        if(intans[i] > 9)
        {
            intans[i] = intans[i] - 10;
            intans[i+1] = intans[i+1] + 1;
        }
    }

    //如果最高位有进位
    if(intans[maxlen]!=0)
    {
        ans[0] = intans[maxlen]+'0';
        //将整型数组转换为字符数组
        for(i=1; i<=maxlen;i++)
        {
            ans[i] = intans[maxlen-i]+'0';
        }
        ans[maxlen+1] = '\0';
    }
    else
    {
        //将整型数组转换为字符数组
        for(i=0; i<maxlen;i++)
        {
            ans[i] = intans[maxlen-i-1]+'0';
        }
        ans[maxlen] = '\0';
    }
    delete [] arrayA;
    delete [] arrayB;
    delete [] intans;
}

int main()
{
    int count = 0;
    char *ans = new char[20];
    char *s1 = "1239945";
    char *s2 = "79999999";
    arbitary_add(s1,s2,ans);
    while(ans[count]!='\0')
    {
        cout << ans[count++] ;
    }
    cout << endl;
    delete [] ans;
    return 0;
}

 

posted @ 2012-04-23 00:16  justinzhang  阅读(443)  评论(0编辑  收藏  举报