51nod 1005 大数加法

Posted 8023spz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1005 大数加法相关的知识,希望对你有一定的参考价值。

给出2个大整数A,B,计算A+B的结果。
 

输入

第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)

输出

输出A + B

输入样例

68932147586
468711654886

输出样例

537643802472

其实包含了减法,就是一个借位的问题。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAX 50000
#define DMAX 10000
using namespace std;
typedef long long ll;
char a[MAX + 10],b[MAX + 10],ans[MAX + 10];
int asign,bsign,anssign;
void re(char *t,int *sign) {///确定符号 保留纯数字
    if(t[0] == -) {
        *sign = -1;
        strcpy(t,t + 1);
    }
    else {
        *sign = 1;
    }
}
void add(char *x,int xsign,char *y,int ysign,char *z) {
    int xlen = strlen(x);
    int ylen = strlen(y);
    int len = max(xlen,ylen);
    int d = 0;
    for(int i = 0;i < len;i ++) {
        if(i < xlen) {
            d += xsign * (x[xlen - i - 1] - 0);
        }
        if(i < ylen) {
            d += ysign * (y[ylen - i - 1] - 0);
        }
        if(d < 0) {///需要借位
            z[i] = 0 + d + 10;
            d = -1;
        }
        else {
            z[i] = 0 + d % 10;
            d /= 10;
        }
    }
    if(d) {
        z[len ++] = 0 + d;
    }
    while(len > 1 && z[len - 1] == 0) len --;///保留一个零~
    z[len] = 0;
    reverse(z,z + len);
}
int strcmp_(char *a,char *b) {
    if(strlen(a) != strlen(b)) return strlen(a) - strlen(b);
    return strcmp(a,b);
}
int main() {
    scanf("%s%s",a,b);
    re(a,&asign);
    re(b,&bsign);
    if(strcmp_(a,b) < 0 && bsign == -1 || strcmp_(a,b) > 0 && asign == -1) {///如果负的那个数的绝对值更大一些 就确定为负数然后两个数的符号取反的计算 方便借位
        anssign = -1;
        add(a,asign * -1,b,bsign * -1,ans);
    }
    else {
        anssign = 1;
        add(a,asign,b,bsign,ans);
    }
    if(anssign == -1) putchar(-);
    printf("%s",ans);
}

 

以上是关于51nod 1005 大数加法的主要内容,如果未能解决你的问题,请参考以下文章

51Nod1005 大数加法

51nod 1005 大数加法

51nod基础题感触(1005大数加法)

大数加法 51nod 转载自 逐梦者

N的阶乘(10000) 51 nod——1057 (大数)

1005 大数加法