鬼晓得昨天晚上我经历了什么,突然发现51nod还是挺好玩的,(主要是ac^n在那里瞎比比说过寒假来要刷完5级算法题,那样明年就能拿银啦,于是我就想啊,我也不能落后啊),于是开始从基础题开始做起,突然发现,基础题对我来说还是挺有困难的,(原来我还这么弱),大数加法如果不考虑负号,我相信还是很快就能写出来,可是它有符号呀,于是我就想了很久很久,那也没办法,最后还是出了一点错误,那就是加起来为0的时候没法输出,于是w一次,找了一下bug,改正了之后就过啦,模拟那个过程,考虑一下正负号情况。写完之后,发现代码太乱了,是不是 要去学一套代码的命名规范了?
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
char s1[10005],s2[10005];
int p1[10005],p2[10005];
int p3[10005];
void plusdashu(int len1,int len2){
memset(p3,0,sizeof(p3));
if(len1==len2){
for(int i=1;i<=len1;i++){
p3[i]=p2[i]+p1[i];
}
}
else if(len1>len2){
int j=len2;
for(int i=len1;i>=1;i--){
if(j>=1)
p3[i]=p1[i]+p2[j];
else p3[i]=p1[i];
--j;
}
}
else{
int j=len1;
for(int i=len2;i>=1;i--){
if(j>=1)
p3[i]=p2[i]+p1[j];
else p3[i]=p2[i];
--j;
}
}
int len=len1>len2?len1:len2;
for(int i=len;i>=1;i--){
if(p3[i]>=10){
p3[i-1]+=1;
p3[i]-=10;
}
}
int flag=1;
for(int i=0;i<=len;i++){
if(flag&&!p3[i]) continue;
else{
flag=0;
printf("%d",p3[i]);
}
}
if(flag) printf("0");
printf("\n");
}
void reduce(int len1,int len2){
memset(p3,0,sizeof(p3));
if(len2>len1||(len1==len2&&p2[1]>p1[1])){
int j=len1;
for(int i=len2;i>=1;i--){
if(j>=1){
if(p2[i]>=p1[j]){
p3[i]=p2[i]-p1[j];
}
else{
p2[i-1]-=1;
p3[i]=10+p2[i]-p1[j];
}
}
else{
if(p2[i]>=0)
p3[i]=p2[i];
else{
p2[i-1]-=1;
p3[i]=p2[i]+10;
}
}
--j;
}
int flag=1;
printf("-");
for(int i=1;i<=len2;i++){
if(flag&&p3[i]==0){
continue;
}
else{
flag=0;
printf("%d",p3[i]);
}
}
if(flag) printf("0");
printf("\n");
}
else{
int j=len2;
for(int i=len1;i>=1;i--){
if(j>=1){
if(p1[i]>=p2[j]){
p3[i]=p1[i]-p2[j];
}
else{
p1[i-1]-=1;
p3[i]=10+p1[i]-p2[j];
}
}
else{
if(p1[i]>=0)
p3[i]=p1[i];
else{
p1[i-1]-=1;
p3[i]=p1[i]+10;
}
}
--j;
}
int flag=1;
for(int i=1;i<=len1;i++){
if(flag&&!p3[i]) continue;
else{
flag=0;
printf("%d",p3[i]);
}
}
if(flag) printf("0");
printf("\n");
}
}
int main()
{
while(scanf("%s",s1)!=EOF){
scanf("%s",s2);
int len1=strlen(s1);
int len2=strlen(s2);
if(s1[0]=='-'&&s2[0]!='-'){
for(int i=1;i<len1;i++){
p2[i]=s1[i]-'0';
}
for(int i=0;i<len2;i++){
p1[i+1]=s2[i]-'0';
}
reduce(len2,len1-1);
}
else if(s1[0]!='-'&&s2[0]=='-'){
for(int i=1;i<len2;i++){
p2[i]=s2[i]-'0';
}
for(int i=0;i<len1;i++){
p1[i+1]=s1[i]-'0';
}
reduce(len1,len2-1);
}
else{
if(s1[0]=='-'){
for(int i=1;i<len1;i++){
p1[i]=s1[i]-'0';
}
for(int i=1;i<len2;i++){
p2[i]=s2[i]-'0';
}
printf("-");
plusdashu(len1-1,len2-1);
}
else{
for(int i=0;i<len1;i++){
p1[i+1]=s1[i]-'0';
}
for(int i=0;i<len2;i++){
p2[i+1]=s2[i]-'0';
}
plusdashu(len1,len2);
}
}
}
return 0;
}