您的位置:首页 > 其它

51nod 1005 大数加法

2017-07-01 23:41 246 查看
给出2个大整数A,B,计算A+B的结果。

Input

第1行:大数A

第2行:大数B

(A,B的长度 <= 10000 需注意:A B有可能为负数)

Output

输出A + B

Input示例

68932147586

468711654886

Output示例

537643802472

这个交上去有几组数据超时,大佬们是用python和java写的 我好尴尬的。。

2017年7月20号更新

自己一直没有搞懂的问题,还是小伙伴来纠正的,自己数据范围开小了,少掉了一个0,就这一个问题 ,代码是很棒哒!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 10000+10

char str1
,str2
;
int num1
,num2
;

void Conversion(char *p,int l,int *num,int *j)
{
int i;
for(i = l-1; i >= 0;i --)
{

num[(*j)++] = p[i]-'0';
}

}

void Addition(int *num1,int *num2,int *i,int l)//加法
{
int j = 0;
while(j < l)
{
num1[(*i)++]+=num2[j++];
}
j = 0;
while(j < l||num1[j])
{
if( num1[j] >= 10)
{
num1[j]%=10;
num1[++j]+= 1;
}
else
++j;
}
*i = j;
}

void Judge(int *num1,int *num2,int *find,int l1,int l2,int *max)
{
//正数大find为1,负数大find为3
//num1大为max=1,num2大为max = 2
l1--;
l2--;
if(*find == 1)//num1为负数
{
if(l1>l2)//l1大于l2时,num1大
{
*find = 3;
*max = 1;
}
else if(l1 == l2)//l1==l2即两数长度相等时
{
while(num1[l1]==num2[l2]&&num1[l1]&&num2[l2])
{
l1--;
l2--;
}
if(num1[l1] > num2[l2])//num1大
{
*find = 3;
*max = 1;
}
else//num2大
{
*find = 1;
*max = 2;
}

}
else//l2小于l2
{
*find = 1;
*max = 2;
}

}
else if(*find==2)//num2为负数
{
if(l2 > l1)
{
*find = 3;
*max = 2;
}
else if(l2 == l1)
{
while(num1[l1]==num2[l2]&&num1[l1]&&num2[l2])
{
l1--;
l2--;
}
if(num1[l1] >= num2[l2])
{
*find = 1;
*max = 1;
}
else
{
*find = 3;
*max = 2;
}

}
else
{
*find = 1;
*max = 1;
}

}
else//两数同号
{
if(l1 > l2)
*max = 1;
else if(l1 == l2)
{
while(num1[l1]==num2[l2]&&l1>0&&l2>0)
{
l1--;
l2--;
}
if(num1[l1] >= num2[l2])
{
*max = 1;
}
else
{
*max = 2;
}
}
else
*max = 2;

}
}

void Subtraction(int *num1,int *num2,int l1,int l2,int *i)//减法
{//*i指向差的长度
int j = 0;

while(j < l2)
{
num1[(*i)++] -= num2[j++];
}
j = l1-1;
while( num1[j]== 0&&j)//去掉前导0
{
j--;
}
if( j == 0)
{
*i = 1;
return;
}
j = 0;
while(j < l1)
{
if( num1[j] < 0)
{
num1[j]+= 10;
num1[++j]-= 1;
}
else
++j;
}
*i = j;
}

void Print(int *num,int find,int n)//输出函数
{
n--;//先自减1
if(find == 3)//如果运算后有负号,输出负号
printf("-");
while(num
==0&&n)//去掉前导0
{
n--;
}
if(n==0)
{
printf("%d\n",num
);//只如果全部为0,只输出一个0并结束函数
return;
}
while(n >= 0)
{

printf("%d",num
);
n--;
}
printf("\n");
}

void Count(char str1[],char str2[],int *num1,int *num2)//完成大数相加
{
int i,j,k;
int m,n;
int l1,l2;
int find=0;
int max;
max = 0;
char *p = str1,*q = str2;

l1 = strlen(str1);
l2 = strlen(str2);

p = str1;
find = 0;
if(str1[0] == '-')//若str1为负数,find标记为1,并去掉负号
{
find = 1;
p++;
l1--;
}

q = str2;
if(str2[0] == '-')//若str2为负数,find标记为2,并去掉负号
{
find = 2;
q++;
l2--;
}

e009
if(str1[0]=='-'&&str2[0] == '-')//若同为负,find标记为3,并去掉负号
find = 3;
i = 0;
Conversion(p,l1,num1,&i);//把字符转为数字
j = 0;
Conversion(q,l2,num2,&j);

m = 0;
if(find == 0||find == 3)//若两数同号
{
Judge(num1,num2,&find,i,j,&max);//判断两者大小,用max做标记
if(max == 1)//若num1大
{
Addition(num1,num2,&m,l1);//相加
Print(num1,find,m);//输出
}
if(max == 2)//若num2大
{
Addition(num2,num1,&m,l2);
Print(num2,find,m);
}
}
n = 0;
if(find == 1||find == 2)//若两者异号
{
Judge(num1,num2,&find,i,j,&max);//判断两数大小
if(max== 1)
{
Subtraction(num1,num2,i,j,&n);//相减
Print(num1,find,n);//输出
}
else if(max == 2)
{
Subtraction(num2,num1,j,i,&n);
Print(num2,find,n);
}
}
}

int main()
{

while(scanf("%s",str1)!=EOF)
{
scanf("%s",str2);
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
Count(str1,str2,num1,num2);//完成大数相加
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: