大明A+B
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5913 Accepted Submission(s): 2030
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
1.1 2.9 1.1111111111 2.3444323343 1 1.1
4 3.4555434454 2.1
典型的大数加法,注意小数点的处理
#include<iostream>
#include<string>
using namespace std;
/*
int main()
{
int l1,l2,i,j,maxl,temp,k,ii,jj,ki,kj,len;
string a,b;
int c[410];
while(cin>>a>>b)
{
l1=a.find('.');
l2=b.find('.');
i=l1-1;
j=l2-1;
maxl=k=i>j?i:j;
i=a.size()-1;
j=b.size()-1;
ii=a.size()-l1-1;
jj=b.size()-l2-1;
temp=0;
if(ii>jj)
k=maxl+1+ii;
else
k=maxl+1+jj;
ki=maxl+1+ii;
kj=maxl+1+jj;
len=k;
cout<<"k="<<k<<" maxl="<<maxl<<endl;
cout<<"maxl+ii=1="<<maxl+ii+1<<" kj="<<kj<<" maxl+jj=1="<<maxl+jj+1<<" ki="<<ki<<endl;
while(maxl+ii+1>kj)
{
c[k]=(a[i]-'0'+temp)%10;
temp=(a[i]-'0'+temp)/10;
k--;
i--;
ii--;
}
while(maxl+jj+1>ki)
{
c[k]=(b[j]-'0'+temp)%10;
temp=(b[j]-'0'+temp)/10;
k--;
j--;
jj--;
}
while(maxl+ii+1>maxl+1&&maxl+jj+1>maxl+1)
{
c[k]=((a[i]-'0')+(b[j]-'0')+temp)%10;
temp=((a[i]-'0')+(b[j]-'0')+temp)/10;
i--;j--;k--;
ii--;
jj--;
}
i=l1-1;
j=l2-1;
maxl=k=i>j?i:j;
while(i>=0&&j>=0)
{
c[k]=((a[i]-'0')+(b[j]-'0')+temp)%10;
temp=((a[i]-'0')+(b[j]-'0')+temp)/10;
i--;j--;k--;
}
while(i>=0)
{
c[k]=(a[i]-'0'+temp)%10;
temp=(a[i]-'0'+temp)/10;
k--;
i--;
}
while(j>=0)
{
c[k]=(b[j]-'0'+temp)%10;
temp=(b[j]-'0'+temp)/10;
k--;
j--;
}
for(i=0;i<=len;i++)
if(i==maxl+1)
cout<<".";
else cout<<c[i];
cout<<endl;
}
return 0;
}*/
#include<stdio.h>
#include<string.h>
char s[402],t[402],c[402];
int a[402];
int main()
{
int i,j,k,d,b,n,m,f,w1,w2;
while(scanf("%s %s",s,t)>0)
{
n=strlen(s);
m=strlen(t);
w1=w2=0;
for(i=0;i<n;i++)
if(s[i]!='.')
if(s[i]!='0')
w1=1;
for(j=0;j<m;j++)
if(t[j]!='.')
if(t[j]!='0')
w2=1;
if(w1==0&&w2==0)
printf("0");
else
{
for(i=0;s[i]!='\0'&&s[i]!='.';i++);
for(j=0;t[j]!='\0'&&t[j]!='.';j++);
if(i==n)
{
s[i]='.';
s[i+1]='0';
n+=2;
s[n]='\0';
}
if(j==m)
{
t[j]='.';
t[j+1]='0';
m+=2;
t[m]='\0';
}
d=i;
b=j;
k=0;
while(1)
{
d--;
b--;
if(d<0)
break;
if(b<0)
break;
c[k++]=s[d]+t[b];
}
if(d>=0)
while(d>=0)
c[k++]=s[d--];
if(b>=0)
while(b>=0)
c[k++]=t[b--];
k--;
for(f=0;k>=0;k--,f++)
if(c[k]>57)
a[f]=c[k]-48*2;
else
a[f]=c[k]-48;
a[f++]=-32767;
while(1)
{
i++;
j++;
if(i==n)
break;
if(j==m)
break;
a[f++]=s[i]+t[j]-2*48;
}
if(i<n)
while(i<n)
a[f++]=s[i++]-48;
if(j<m)
while(j<m)
a[f++]=t[j++]-48;
for(i=f-1;i>0;i--)
if(a[i]>0)
if(a[i]/10>0)
{
if(a[i-1]>=0)
a[i-1]+=a[i]/10;
else
a[i-2]+=a[i]/10;
a[i]=a[i]%10;
}
for(j=f-1;j>=0;j--)
if(a[j]<0)
{
j--;
break;
}
else
if(a[j]!=0)
break;
for(i=0;i<=j;i++)
if(a[i]<0)
printf(".");
else
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}