zoukankan      html  css  js  c++  java
  • 高精度加法

    /*
    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;
    }
  • 相关阅读:
    Java实现 洛谷 P1060 开心的金明
    (Java实现) 洛谷 P1605 迷宫
    (Java实现) 洛谷 P1605 迷宫
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
    Java实现 洛谷 P1064 金明的预算方案
    (Java实现) 洛谷 P1031 均分纸牌
    QT树莓派交叉编译环开发环境搭建(附多个exe工具下载链接)
    武则天红人对唐睿宗的桃色报复(如此缺少城府,注定了要在宫廷中过早地出局)
  • 原文地址:https://www.cnblogs.com/justinzhang/p/2465809.html
Copyright © 2011-2022 走看看