• 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);
    }
  • 相关阅读:
    [建议]我对博客园的发展的一点想法
    [转载] 理想、激情、生存—— 一位技术管理人员的20年工作经历和感悟
    FIT FOR .NET(3)
    基于真实项目的TDD应用
    [团队公告]博客园的敏捷软件开发团队成立了
    .NET数据访问体系结构指南
    这是不是微软MSN的一个Bug呢?
    抽象工厂的应用
    简单基础的问题,但是非常容易出错.
    VS 2005 Beta2 Team Suite Edtion
  • 原文地址:https://www.cnblogs.com/8023spz/p/10045881.html
Copyright © 2020-2023  润新知