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 大数加法的主要内容,如果未能解决你的问题,请参考以下文章