A+BProblemIV
题目描述
acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这个问题给解决了。
输入
包含多组测试数据
每组数据包含两个正数A,B(可能为小数且位数不大于400)
每组数据包含两个正数A,B(可能为小数且位数不大于400)
输出
每组输出数据占一行,输出A+B的结果,结果需要是最简的形式。
样例输入
1.9 0.1 0.1 0.9 1.23 2.1 3 4.0
样例输出
2 1 3.33 7代码示例:
#include<stdio.h>
#include<string.h>
char a[1000],b[1000],c[1000];
int main()
{
while(~scanf("%s%s",a,b))
{
int i,j,signa,signb,la,lb;
memset(c,0x00,sizeof(c));
la=strlen(a);
lb=strlen(b);
for(i=0; i<la; i++)
{
if(a[i]=='.')//找出小数点的位置
{
signa=i;
break;
}
}
if(i==la)
{
signa=la;//如果是整数,就把它变为小数,且要把此时的小数点位置找出
a[la]='.';
a[la+1]='0';
la=la+2;
}
for(j=0; j<lb; j++)
{
if(b[j]=='.')
{
signb=j;
break;
}
}
if(j==lb)
{
signb=lb;
b[lb]='.';
b[lb+1]='0';
lb=lb+2;
}
int d=0,sum,ans=0;
int k=la-signa;//有多少小数位
int t=lb-signb;//有多少小数位
i=la-1;
j=lb-1;
if(k>t)
{
int N=k-t;
while(N--)
{
c[ans++]=a[i--];
}
while(a[i]!='.')
{
sum=a[i]-'0'+b[j]-'0'+d;
d=sum/10;
c[ans]=sum%10+'0';
i--;
j--;
ans++;
}
}
else
{
int N=t-k;
while(N--)
{
c[ans++]=b[j--];
}
while(b[j]!='.')
{
sum=a[i]-'0'+b[j]-'0'+d;
d=sum/10;
c[ans]=sum%10+'0';
i--;
j--;
ans++;
}
}
c[ans]='.';
ans++;
i=signa-1;
j=signb-1;
if(signa>signb)
{
while(j>=0)
{
sum=a[i]-'0'+b[j]-'0'+d;
d=sum/10;
c[ans]=sum%10+'0';
i--;
j--;
ans++;
}
while(i>=0)
{
sum=a[i]-'0'+d;
d=sum/10;
c[ans]=sum%10+'0';
i--;
ans++;
}
}
else
{
while(i>=0)
{
sum=a[i]-'0'+b[j]-'0'+d;
d=sum/10;
c[ans]=sum%10+'0';
i--;
j--;
ans++;
}
while(j>=0)
{
sum=b[j]-'0'+d;
d=sum/10;
c[ans]=sum%10+'0';
j--;
ans++;
}
}
if(d==1)
printf("1");
for(i=ans-1; i>=0; i--)
{
if(c[i]=='.')
break;
else
printf("%c",c[i]);
}
for(j=0; j<i; j++)
{
if(c[j]!='0')//切记是字符型0
break;
}
if(j!=i)
{
for(k=i; k>=j; k--)
printf("%c",c[k]);
}
printf("\n");
}
return 0;
}