c语言大数加法

大数加法

Time Limit: 3000ms, Memory Limit: 10000KB , Accepted: 2291, Total Submissions: 3216

Description

编写一个程序实现A+B。不过与我们以前完成过的A+B不一样,A和B两个数的位数有近100位。注意:需要处理正负数的情形,但不考虑小数。
提示:C或C++没有直接表示100位的数据类型,我们得自己先构造一个合适的类型,接下来还需要一些巧妙的方法处理100位数的输入和输出,因为标准输入输出同样没有这样类型的处理功能。

Input

分别用两行输入不超过100位的A和B(没有小数点,允许正负号)。

Output

输出A+B的结果。

  • Sample Input 
    3333333333333333333333333333333333
    -2222222222222222222222222222222222
  • Sample Output

    1111111111111111111111111111111111



#include<stdio.h>
#include<string.h>
int x[100],y[100],c[200],m,n;
char a[100],b[100];
void dec();
void mul();
int max(int x,int y);
int main()
{

int i,j,z,d,k;
scanf("%s",&a);
scanf("%s",&b);
m=strlen(a);
n=strlen(b);
for(i=0;i<100;i++)
{
x[i]=0,y[i]=0;
}
if(a[0]=='-'&&b[0]!='-')
{
j=0;
for(i=m-1;i>=1;i--)
{
x[j]=a[i]-48;
j++;

j=0;
for(i=n-1;i>=0;i--)
{
y[j]=b[i]-48;
j++;
}
m--;
printf("-");
dec();
    }  
if(a[0]!='-'&&b[0]=='-')
{
j=0;
for(i=m-1;i>=0;i--)
{
x[j]=a[i]-48;
j++;

j=0;
for(i=n-1;i>=1;i--)
{
y[j]=b[i]-48;
j++;
}
n--;
dec();
    }
    if(a[0]!='-'&&b[0]!='-')
{
j=0;
for(i=m-1;i>=0;i--)
{
x[j]=a[i]-48;
j++;

j=0;
for(i=n-1;i>=0;i--)
{
y[j]=b[i]-48;
j++;
}
mul();
    }
    if(a[0]=='-'&&b[0]=='-')
{
j=0;
for(i=m-1;i>=1;i--)
{
x[j]=a[i]-48;
j++;

j=0;
for(i=n-1;i>=1;i--)
{
y[j]=b[i]-48;
j++;
}
m--;
n--;
printf("-");
mul();
    }
}
void mul()
{
int i,j,z,k,d;
for(i=0;i<=max(m,n);i++)
{
c[i]=0;
}
for(i=0;i<max(m,n);i++)
{
c[i]=x[i]+y[i];
    }
    for(i=0;i<max(m,n);i++)
    {
    if(c[i]>=10)
    {
    d=c[i]%10;
    k=c[i]/10;
    c[i]=d;
       c[i+1]+=k;
    }
    }
for(int i=max(m,n);i>=0;i--)
{
if(c[i]!=0)
{
for(j=i;j>=0;j--)
{
printf("%d",c[j]);
if(j==0)return ;
}
}

}
}
void dec()
{
int i,j,z,k,d;
for(i=0;i<=max(m,n);i++)
{
c[i]=0;
}
if(a[0]!='-')
{
if(m>n||m==n&&x[m-1]>y[m-1])
{
for(i=0;i<max(m,n);i++)
{
if(x[i]>=y[i])
c[i]=x[i]-y[i];
else 
{
c[i]=10+x[i]-y[i];
c[i+1]--;
}
    }
    }
    if(m<n||m==n&&x[m-1]<y[m-1])
    {
    for(i=0;i<max(m,n);i++)
{
if(y[i]>=x[i])
c[i]=y[i]-x[i];
else 
{
c[i]=10+y[i]-x[i];
c[i+1]--;
}
printf("-");
    }
    }
    }
    if(a[0]=='-')
    {
    if(m<n||m==n&&x[m-1]>y[m-1])
{
for(i=0;i<max(m,n);i++)
{
if(y[i]>=x[i])
c[i]=y[i]-x[i];
else 
{
c[i]=10+y[i]-x[i];
c[i+1]--;
}
    }
    }
    if(m>n||m==n&&x[m-1]>y[m-1])
    {
    for(i=0;i<max(m,n);i++)
{
if(y[i]<=x[i])
c[i]=x[i]-y[i];
else 
{
c[i]=10+x[i]-y[i];
c[i+1]--;
}
printf("-");
    }
    }
    }
    for(i=0;i<max(m,n);i++)
    {
    if(c[i]>=10)
    {
    d=c[i]%10;
    k=c[i]/10;
    c[i]=d;
       c[i+1]+=k;
    }
    else if(c[i]<0)
    {
    c[i]=10+c[i];
    c[i+1]--;
    }
    }
for(int i=max(m,n);i>=0;i--)
{
if(c[i]!=0)
{
for(j=i;j>=0;j--)
{
printf("%d",c[j]);
if(j==0)return ;
}

}
}
}
int max(int x,int y)
{
int t;
if(x<y)
{
t=x;
x=y;
y=t;
}
    return x;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值