题目链接:点击打开链接
题目:
给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472
题目描述:
简单的大数加法,带有负数,实际上就是大数加法和大数减法的结合,注意考虑0,0、-0,-0的情况。仔细一点,问题不大。
解题代码:
#include<stdio.h>
#include<string.h>
int main()
{
int a[10010],b[10010];
int i,f,g;
char aa[10010],bb[10010];
scanf("%s%s",aa,bb);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
f = g = 0;
if(aa[0] == '-')
f = 1;
if(bb[0] == '-')
g = 1;
if(!f)
for(i = strlen(aa) - 1;i >= 0;i --)
a[strlen(aa) - 1 - i] = aa[i] - '0';
else
for(i = strlen(aa) - 1;i > 0;i --)
a[strlen(aa) - 1 - i] = aa[i] - '0';
if(!g)
for(i = strlen(bb) - 1;i >= 0;i --)
b[strlen(bb) - 1 - i] = bb[i] - '0';
else
for(i = strlen(bb) - 1;i > 0;i --)
b[strlen(bb) - 1 - i] = bb[i] - '0';
if(f && g){
for(i = 0;i < (strlen(aa) > strlen(bb) ? strlen(aa) : strlen(bb));i ++){
a[i] += b[i];
if(a[i] >= 10){
a[i] -= 10;
a[i + 1] ++;
}
}
if(strlen(aa) == strlen(bb) && strlen(aa) == 2 && a[0] == b[0] && a[0] == 0){
printf("0\n");
return 0;
}
putchar('-');
int j = 0;
for(i = 10010 - 1;i >= 0;i --){
if(j)
printf("%d",a[i]);
else if(a[i] ){
printf("%d",a[i]);
j = 1;
}
}
if(!j)
printf("0");
putchar('\n');
}
else if(!f && !g){
for(i = 0;i < (strlen(aa) > strlen(bb) ? strlen(aa) : strlen(bb));i ++){
a[i] += b[i];
if(a[i] >= 10){
a[i] -= 10;
a[i + 1] ++;
}
}
int j = 0;
for(i = 10010 - 1;i >= 0;i --){
if(j)
printf("%d",a[i]);
else if(a[i] ){
printf("%d",a[i]);
j = 1;
}
}
if(!j)
printf("0");
putchar('\n');
}
else if(!f && g){
int x = 1;
if(strlen(aa) > strlen(bb) - 1)
x = 1;
else if(strlen(aa) < strlen(bb) - 1)
x = 0;
else{
for(i = strlen(aa) - 1; i >= 0;i --) {
if(a[i] > b[i]){
x = 1;
break;
}
else if(a[i] < b[i]){
x = 0;
break;
}
}
}
// printf("%d\n",x);
for(i = 0;i < (x ? strlen(aa) : strlen(bb) - 1);i ++){
if(x){
a[i] -= b[i];
if(a[i] < 0){
a[i] += 10;
a[i + 1] --;
}
}
else{
b[i] -= a[i];
if(b[i] < 0){
b[i] += 10;
b[i + 1] --;
}
}
}
if(!x)
putchar('-');
if(x){
int j = 0;
for(i = 10010 - 1;i >= 0;i --){
if(j)
printf("%d",a[i]);
else if(a[i] ){
printf("%d",a[i]);
j = 1;
}
}
if(!j)
printf("0");
}
else{
int j = 0;
for(i = 10010 - 1;i >= 0;i --){
if(j)
printf("%d",b[i]);
else if(b[i] ){
printf("%d",b[i]);
j = 1;
}
}
if(!j)
printf("0");
}
putchar('\n');
}
else{
int x = 0;
if(strlen(aa) - 1 > strlen(bb))
x = 1;
else if(strlen(aa) - 1 < strlen(bb))
x = 0;
else{
for(i = strlen(bb) - 1; i >= 0;i --) {
if(a[i] > b[i]){
x = 1;
break;
}
else if(a[i] < b[i]){
x = 0;
break;
}
}
}
// printf("%d\n",x);
for(i = 0;i < (x ? strlen(aa) - 1 : strlen(bb));i ++){
if(x){
a[i] -= b[i];
if(a[i] < 0){
a[i] += 10;
a[i + 1] --;
}
}
else{
b[i] -= a[i];
if(b[i] < 0){
b[i] += 10;
b[i + 1] --;
}
}
}
if(x)
putchar('-');
if(x){
int j = 0;
for(i = 10010 - 1;i >= 0;i --){
if(j)
printf("%d",a[i]);
else if(a[i] ){
printf("%d",a[i]);
j = 1;
}
}
if(!j)
printf("0");
}
else{
int j = 0;
for(i = 10010 - 1;i >= 0;i --){
if(j)
printf("%d",b[i]);
else if(b[i] ){
printf("%d",b[i]);
j = 1;
}
}
if(!j)
printf("0");
}
putchar('\n');
}
return 0;
}