美文网首页
高精度加法(C++实现)

高精度加法(C++实现)

作者: 无聊的CairBin | 来源:发表于2022-01-16 15:16 被阅读0次

    高精度加法

    简介

    用于计算含有超过一般变量存放不下的非负整数

    高精度加法这个过程是模拟的小学竖式加法计算

    步骤

    以下有顺序之分

    • 数组清零
    • 输入
    • 获取长度
    • 逆置
    • 字符型数字转成对应的整型数字
    • 计算并输出

    简单来看重要的步骤也就以下几步

    • 清零
    • 逆置
    • 转换
    • 相加计算(包含进位)

    代码实现

    逆置

    因为数组存放的元素顺序与我们计算的顺序是相反的,在竖式计算中我们是将其右对齐(个位对个位,十位对十位,以此类推),而读取数字后的两个数组是左对齐的,因此我们要将里面的元素逆置

    //参数:需要逆置的数组,数组长度
    void invertElem(char s[], unsigned long n)
    {
        unsigned long len = n - 1;
        for (int i = 0, j = len; i < j; i++, j--)
        {
            char temp = s[i];
            s[i] = s[j];
            s[j] = temp;
        }
    
    }
    

    转换

    为了方便计算和进位,我们需要将字符型的数字转化成实际数字

    注意:这里的转换不是类型转换,例如字符类型8,我们要让它自减48,转化成ASCII码为8的对应的字符,存放元素的数组的类型并没有改变

    转换必须在逆置之后。如果转换在前逆置在后,则逆置时分不清末尾的0是数字的一部分还是结束符转换后的数字

    //参数:数组,长度
    void charInt(char s[], unsigned long n)
    {
        for (int i = 0; i < n; i++)
            s[i] -= 48;
    }
    

    相加

    有了以上两个函数之后,我们就可以进行相加了,这里不多说,分析都在注释里,所以直接上代码

    int main()
    {
        while (1)
        {
            char a[1024];
            char b[1024];
            char c[2049];
    
            //这里必须将每一个元素都置为0,否则位数不同的数字相加时会乱掉
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            memset(c, 0, sizeof(c));
    
            scanf("%s", a);
            scanf("%s", b);
    
            //长度获取要在转换之前
            unsigned long len_a = strlen(a);
            unsigned long len_b = strlen(b);
    
            unsigned long max_len = len_a > len_b ? len_a : len_b;
    
            //逆置
            invertElem(a, len_a);
            invertElem(b, len_b);
    
            //转换
            charInt(a, len_a);
            charInt(b, len_b);
    
            int carry = 0; //进位
    
            //相加,核心步骤
            //这里的i必须能取到max_len,最高位计算式可能会向前进一位
            //比如99+1,原本最多两位,相加后得到了一个三位数
            for (int i = 0; i <= max_len; i++)
            {
                c[i] = (carry + a[i] + b[i]) % 10;
                carry = (carry + a[i] + b[i]) / 10;
            }
    
            int i;
            //寻找第一个不为0的数字或全是0的情况况下找到最后一个0
            //这是为了防止00+0之类的特殊情况,在这种情况发生时确保只输出一个0
            for (i = max_len; i >= 1 && c[i] == 0; i--);
    
            for (; i >= 0; i--)
                printf("%d", c[i]);
            printf("\n");
    
        }
    
    
        return 0;
    }
    

    完整代码

    #include <iostream>
    #include <string.h>
    #include <math.h>
    
    using namespace std;
    //参数:需要逆置的数组,数组长度
    void invertElem(char s[], unsigned long n)
    {
        unsigned long len = n - 1;
        for (int i = 0, j = len; i < j; i++, j--)
        {
            char temp = s[i];
            s[i] = s[j];
            s[j] = temp;
        }
    
    }
    
    void charInt(char s[], unsigned long n)
    {
        for (int i = 0; i < n; i++)
            s[i] -= 48;
    }
    
    int main()
    {
        while (1)
        {
            char a[1024];
            char b[1024];
            char c[2049];
    
            //这里必须将每一个元素都置为0,否则位数不同的数字相加时会乱掉
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            memset(c, 0, sizeof(c));
    
            scanf("%s", a);
            scanf("%s", b);
    
            //长度获取要在转换之前
            unsigned long len_a = strlen(a);
            unsigned long len_b = strlen(b);
    
            unsigned long max_len = len_a > len_b ? len_a : len_b;
    
            //逆置
            invertElem(a, len_a);
            invertElem(b, len_b);
    
            //转换
            charInt(a, len_a);
            charInt(b, len_b);
    
            int carry = 0; //进位
    
            //相加,核心步骤
            //这里的i必须能取到max_len,最高位计算式可能会向前进一位
            //比如99+1,原本最多两位,相加后得到了一个三位数
            for (int i = 0; i <= max_len; i++)
            {
                c[i] = (carry + a[i] + b[i]) % 10;
                carry = (carry + a[i] + b[i]) / 10;
            }
    
            int i;
            //寻找第一个不为0的数字或全是0的情况况下找到最后一个0
            //这是为了防止00+0之类的特殊情况,在这种情况发生时确保只输出一个0
            for (i = max_len; i >= 1 && c[i] == 0; i--);
    
            for (; i >= 0; i--)
                printf("%d", c[i]);
            printf("\n");
    
        }
    
    
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:高精度加法(C++实现)

          本文链接:https://www.haomeiwen.com/subject/elmfhrtx.html