大整数加减法(基础,细节题型)
程序员文章站
2024-03-23 15:58:34
...
大数加法
51Nod - 1005
给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Sample Input
68932147586
468711654886
Sample Output
537643802472
这个题的意思很简单,如上所述,其实就是让你写两个 用字符串计算 正数加法和减法的函数,这两个函数 的原理 和 大致的模型是一样的 ,函数如下 ,大家可以对比一下这两个函数,其实原理很简单,就是将平时我们在演草纸上进行的加法运算或者剑法运算用字符串的形式表示出来就行了,这里需要注意一下一些细节: 加法中的进位和减法中的借位(自己起的名字,我也不太清楚叫什么,嘿嘿)。代码如下,这个代码本来是可以再优化一下的, 但是我就得这个比较详细,比较适合大家理解代码所以就没有进行优化,代码虽然有点长,但是 其中两个函数大概是一样的,而且主函数就是分了几种结果的类型,很好理解的哟!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int cmp(char *a, char *b)// 比较 连个数字字符串所对应的数字的大小
{
int a_len = strlen(a);
int b_len = strlen(b);
if(a_len > b_len)
return 1;
else if(a_len < b_len)
return -1;
else
return strcmp(a, b);
}
void Add(char *a, char *b)
{
int a_len = strlen(a);
int b_len = strlen(b);
int maxlen = max(a_len, b_len);
int m = 0, n = 0; //m n 表示位上的数字
int c = 0, i; //c 表示 进位
char *p = new char[maxlen + 2]; //储存结果
char *pa = a + a_len - 1;
char *pb = b + b_len - 1;
for(i = 0; i < maxlen; i++)
{
m = n = 0;
if(pa+1 != a)
{
m = *pa - 48; // 0 的Asic 是 48
pa--;
}
if(pb+1 != b)
{
n = *pb - 48;
pb--;
}
*(p+i) = (m + n + c) % 10 + 48;//将结果转化为字符串进行存储
c = (m + n + c) / 10;
}
if(c > 0) // 表示最后一位还有进位
{
*(p+i) = c + 48;
*(p+i+1) = '\0';
}
else
*(p+i) = '\0';
int p_len = strlen(p);
int flag = 0;
for(int j = p_len - 1; j >= 0; j--)
{
if(*(p+j) > '0') flag = 1;
if(flag == 1)
printf("%c", *(p+j));
}
if(p_len == 1 && p[0] == '0')
printf("0");
cout<<endl;
}
void Sub(char *a, char *b)
{
int a_len = strlen(a);
int b_len = strlen(b);
int maxlen = max(a_len, b_len);
int m = 0, n = 0;
int c = 0, i;
char *p = new char[maxlen + 2];
char *pa = a + a_len - 1;
char *pb = b + b_len - 1;
for(i = 0; i < maxlen; i++)
{
m = n = 0;
if(pa + 1 != a)
{
m = *pa - 48;
pa--;
}
if(pb + 1 != b)
{
n = *pb - 48;
pb--;
}
m -= c;
if(m < n) m += 10, c = 1;
else c = 0;
*(p+i) = m - n + 48;
}
*(p+i) = '\0';
int p_len = strlen(p);
int flag = 0;
for(int j = p_len - 1; j >= 0; j--)
{
if(*(p+j) > '0') flag = 1;
if(flag == 1)
printf("%c", *(p+j));
}
cout<<endl;
}
int main()
{
char a[10010], b[10010];
gets(a);
gets(b);
if(a[0] != '-' && b[0] != '-')
Add(a, b);
else if(a[0] == '-' && b[0] == '-')
{
printf("-");
Add(a+1, b+1);
}
else if(a[0] != '-' && b[0] == '-')
{
if(cmp(a, b+1) < 0)
{
printf("-");
Sub(b+1, a);
}
else if(cmp(a, b+1) > 0)
Sub(a, b+1);
else
printf("0\n");
}
else if(a[0] == '-' && b[0] != '-')
{
if(cmp(b, a+1) < 0)
{
printf("-");
Sub(a+1, b);
}
else if(cmp(b, a+1) > 0)
Sub(b, a+1);
else
printf("0\n");
}
return 0;
}