您的位置:首页 > 其它

51nod 1005 大数加法

2016-11-30 19:24 302 查看
给出2个大整数A,B,计算A+B的结果。

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


Output
输出A + B


Input示例
68932147586
468711654886


Output示例
537643802472


纯粹的模拟,主要分一下几种情况:

首先判断两个大数是否同号,同号则相加;否则,相减。相减又分为三大种情况:len1的长度大于len2,直接num1-num2;len1小于len2时,num2-num1即可;

长度相等时,通过循环判断大小,并做标记;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#define M 10005
using namespace std;

char s1[M],s2[M];
int num1[M],num2[M];

int main(){

while(cin >> s1 >> s2){
int len1 = strlen(s1),len2 = strlen(s2);
char ch1 = '+',ch2 = '+',ch;
int flag = 0,i,j = len2,k = len1,x,y = 0;

memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));

if(s1[0] == '-' || s1[0] == '+'){
ch1 = s1[0];
k = len1-1;
}
if(s2[0] == '-' || s2[0] == '+'){
ch2 = s2[0];
j = len2-1;
}

for(i = len1-1,x = 0;i >= 0 && (s1[i] != '-' && s1[i] != '+') ;i --)
num1[x++] = s1[i] - '0';
for(i = len2-1,x = 0;i >= 0 && (s2[i] != '-' && s2[i] != '+');i --)
num2[x++] = s2[i] - '0';

if(ch1 != ch2){
if(j < k){
for(i = 0; i < k; i ++){
if(num1[i] < num2[i]){
num1[i] += 10;
num1[i+1] --;
}
num1[i] -= num2[i];
}
}
else if(j > k){
for(i = 0; i < j; i ++){
if(num1[i] > num2[i]){
num2[i] += 10;
num2[i+1] --;
}
num1[i] = num2[i] - num1[i];
}
}
else{
for(i = j; i >=0; i --){
if(num1[i] > num2[i]){
flag = 1;
break;
}
else if(num1[i] < num2[i]){
y = 1;
break;
}
}

if(flag){
for(i = 0; i < j; i ++){
if(num1[i] < num2[i]){
num1[i] += 10;
num1[i+1] --;
}
num1[i] -= num2[i];
}
}
else{
for(i = 0; i < j; i ++){
if(num1[i] > num2[i]){
num2[i] += 10;
num2[i+1] --;
}
num1[i] = num2[i] - num1[i];
}
}
}
}
else{
int temp = 0,tmp;
for(i = 0; i < M; i ++){
tmp = num1[i] + num2[i] + temp;
num1[i] = tmp % 10;
temp = tmp / 10;
}
}

if((ch1 == '-' && k > j) || (ch2 == '-' && k < j ) || (ch1 == '-' && ch2 == '-') || (ch1 == '-' && flag) || (ch2 == '-' && y))
printf("-");

flag = 0;
for(i = M; i >= 0; i --){
if(num1[i])
flag = 1;

if(flag)
printf("%d",num1[i]);
}
if(!flag)
printf("0");
putchar('\n');
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: