大数加法:(两个正整数相加)
以字符串的形式输入,然后将两个字符串倒转转换成int形式存在数组中,再进行加法模拟。
例如: 123456789 +11111111
1.转换成int x : 9 8 7 6 5 4 3 2 1
y : 1 1 1 1 1 1 1 1
2.像平时做加法一样,从低位开始加,大于等于10进行进位,这里从 1+9 开始
x : 9 8 7 6 5 4 3 2 1
+ y : 1 1 1 1 1 1 1 1
c : 0 0 9 7 6 5 4 3 1
3.再倒着输出数组c (注意最高位是否进位):134567900
代码:
#include
#include
#include
using namespace std;
char a[1000005],b[1000005];
int x[1000005],y[1000005],c[1000010];
int main()
{
while(~scanf("%s%s",a,b))
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(c,0,sizeof(c));
int len1=strlen(a),len2=strlen(b),len;
for(int i=len1-1,j=0;i>=0;i--,j++)
x[j]=a[i]-'0';
for(int i=len2-1,j=0;i>=0;i--,j++)
y[j]=b[i]-'0';
len=max(len1,len2);
for(int i=0;i<=len;i++)
{
c[i]+=(x[i]+y[i]);
if(c[i]>9)
{
c[i+1]+=(c[i]/10);
c[i]%=10;
}
}
if(c[len]) printf("%d",c[len]);
for(int i=len-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
return 0;
}
大数减法:
减法 相当于加上一个负数 ,具体实现和加法差不多,如果最后最高位是正数,就把每一位都变成正数,如果是负数的话就把每一位变成负数
例如: 123-456 1234 - 4321
x : 3 2 1 4 3 2 1
+ y : -6 -5 -4 -1 -2 -3 -4
c : -3 -3 -3 3 1 -1 -3
最高位是负数且所有位都是负数,结果就是-333 最高位是负数,把所有位都化成负数 -7 -8 0 -3 结果就是-3087
代码:
#include
#include
#include
using namespace std;
const int N=100005;
char a[N],b[N];
int x[N],y[N],c[N];
int main()
{
while(~scanf("%s%s",a,b))
{
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(c,0,sizeof(c));
int la=strlen(a),lb=strlen(b),len=max(la,lb);
for(int i=la-1,j=0; i>=0; i--,j++)
x[j]=a[i]-'0';
for(int i=lb-1,j=0; i>=0; i--,j++)
y[j]=-(b[i]-'0');
for(int i=0; i0)
{
for(int i=0; i=0; i--)
printf("%d",c[i]);
printf("\n");
}
else
{
for(int i=0;i0)
{
c[i+1]+=1;
c[i]-=10;
}
while(1)
{
if(c[len-1]==0) len--;
else break;
if(len==0) break;
}
printf("-");
for(int i=len-1; i>=0; i--)
printf("%d",-c[i]);
printf("\n");
}
}
return 0;
}