大数加法
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;
}
#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;
}