大数加法
多谢博客大大的指点 :https://blog.csdn.net/u012773338/article/details/41789401
大数加法,其实就是每个数的加法,C++的代码好长啊,不过仔细看还是有规律的,上代码
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
char x[100010],y[100010];//以字符型输入大数x,y
int a[100010]={0},b[100010]={0};//用来将大数放入int a,b 初始化为0
int size1,size2,size,flag1=0,flag2=0;//分别存x,y的长度,flag1,flag2用来判断x,y的正负
cin>>x>>y;
size1=strlen(x);size2=strlen(y);
if(x[0]=='-')//x 为负数
{
flag1=1;
for(int i=0;i<size1-1;i++)//除负号外倒叙存放在a[]中
a[i]=x[size1-1-i]-'0';
}
else//x 正数
{
for(int i=0;i<size1;i++)
a[i]=x[size1-1-i]-'0';
}
if(y[0]=='-')//y 负数
{
flag2=1;
for(int i=0;i<size2-1;i++)//除负号外倒叙存放b[]中
b[i]=y[size2-1-i]-'0';
}
else //y 正数
{
for(int i=0;i<size2;i++)
b[i]=y[size2-1-i]-'0';
}
if(flag1==0 && flag2==0)//x,y都为正
{
size=max(size1,size2);//找出里面长度最大值
for(int i=0;i<size;i++)//对应 位 相加
{
a[i]+=b[i];
if(a[i]>=10)//大于10进一
{
a[i]-=10;
a[i+1]++;
}
}
for(int i=size;i>=0;i--)//倒叙输出即为所求
{
if(i==size&&a[i]!=0)//判断最高位是否进一
cout<<a[i];
if(i!=size)
cout<<a[i];
}
cout<<endl;
}
if(flag1==1 && flag2==1)//x ,y 负
{
size=(size1-1,size2-1);
for(int i=0;i<size;i++)
{
a[i]+=b[i];
if(a[i]>=10)
{
a[i]-=10;
a[i+1]++;
}
}
cout<<"-";//提前输出“-”号
for(int i=size;i>=0;i--)
{
if(i==size&&a[i]!=0)
cout<<a[i];
if(i!=size)
cout<<a[i];
}
cout<<endl;
}
if(flag1==0 && flag2==1)//x正,y负
{
size=max(size1,size2-1);
int flagBig=0;//用来判断大小
if(size1<size2-1)
flagBig=1;
else
{
if(size1==size2-1)
{
for(int i=size;i>=0;i--)
{
if(a[i]<b[i])
{
flagBig=1;
break;
}
}
}
}
if(flagBig==1)//y负数大
{
for(int i=0;i<size;i++)
{
b[i]-=a[i];
if(b[i]<0)//高位借一
{
b[i]+=10;
b[i+1]--;
}
}
cout<<"-";
for(int i=size-1;i>=0;i--)
{
if(i==size-1&&b[i]!=0)
cout<<b[i];
if(i!=size-1)
cout<<b[i];
}
cout<<endl;
}
else//x正大或相等
{
for(int i=0;i<size;i++)
{
a[i]-=b[i];
if(a[i]<0)
{
a[i]+=10;
a[i+1]--;
}
}
for(int i=size-1;i>=0;i--)//一正一负的情况下最高位不可能进一,最高位为size-1
{
if(i==size-1&&a[i]!=0)
cout<<a[i];
if(i!=size-1)
cout<<a[i];
}
cout<<endl;
}
}
if(flag1==1 &&flag2==0)//x负,y正
{
int flagBig=0;
size=max(size1-1,size2);
if(size1-1>size2)
flagBig=1;
else
{
if(size1-1==size2)
{
for(int i=size;i>=0;i--)
{
if(a[i]>b[i])
{
flagBig=1;
break;
}
}
}
}
if(flagBig==1)//x负大
{
for(int i=0;i<size;i++)
{
a[i]-=b[i];
if(a[i]<0)
{
a[i]+=10;
a[i+1]--;
}
}
cout<<"-";
for(int i=size-1;i>=0;i--)
{
if(i!=size-1)
cout<<a[i];
if(i==size-1&& a[i]!=0)
cout<<a[i];
}
cout<<endl;
}
else//y正大或相等
{
for(int i=0;i<size;i++)
{
b[i]-=a[i];
if(b[i]<0)
{
b[i]+=10;
b[i+1]--;
}
}
for(int i=size-1;i>=0;i--)
{
if(i!=size-1)
cout<<b[i];
if(i==size-1&& b[i]!=0)
cout<<b[i];
}
cout<<endl;
}
}
return 0;
}
应该是能看懂的,觉得已经很好理解了
但有一个问题 51nod 里面 1005过不了
还请各位大佬指教