正数的大数加法

大数加法

大数加法很简单,只需要模拟我们平常的加法运算,然后把结果用字符串来存下就行,难度不大。如果想做带有负数的加法,只需要做点小改动就行。我就只写正数的了,

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

const int SIZE = 1e5;
int main() {
    bool jinwei = false;//记录是否可以进1位
    int len1, len2, len3, m1, m2, m3;//len1为a1长度,len2为a2长度,len3为a3长度,m1,m2,m3分别为记录a1,a2,a3开始遍历的位置
    char a1[SIZE], a2[SIZE], a3[SIZE];
    memset(a1, '\0', sizeof(a1));
    memset(a2, '\0', sizeof(a2));
    memset(a3, '\0', sizeof(a3));
    scanf("%s%s", a1, a2);
    len1 = strlen(a1), len2 = strlen(a2);
    m1 = len1-1, m2 = len2-1, m3 = 0;
    for(int i = 0; i < max(len1, len2); i++) {
        int j1, j2, j3;
        if(m1 >= 0 && m2 >= 0) {    //如果遍历的位置都还有数字就相加
            j1 = a1[m1--]-'0';
            j2 = a2[m2--]-'0';
            j3 = j1 + j2;
            if(jinwei)
                j3++;
            if(j3 >= 10) //如果两数字相加为两位,进位,jinwei记录状态
                jinwei = true;
            else
                jinwei = false;
            a3[m3++] = j3%10 + '0';
        } else if(m1 < 0) {    //如果只有一个数字,就相当于它加零
            j3 = a2[m2--]-'0';
            if(jinwei)
                j3++;
            if(j3 >= 10)
                jinwei = true;
            else
                jinwei = false;
            a3[m3++] = j3%10 + '0';
        } else if (m2 < 0) {
            j3 = a1[m1--]-'0';
            if(jinwei)
                j3++;
            if(j3 >= 10)
                jinwei = true;
            else
                jinwei = false;
            a3[m3++] = j3%10 + '0';
        }
    }
    if(jinwei)
        a3[m3++] = 1 + '0';//可能它们都没有数字了,但是有进位
    len3 = strlen(a3);
    for(int i = len3-1; i >= 0; i--) {
        printf("%c", a3[i]);
    }
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/songziqi98/article/details/80502337
今日推荐