包含小数点的字符串加法
测试输入:
0.0000001 0.1
1.0 2
100.89 1.13
0.0000000 1.1
输出
0.1000001
1.2
102.02
1.1
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int i,j,k,m,n,alen,blen;
char t,x[210],y[210],a[210],b[210],c[210],d[210];
while(scanf("%s%s",x,y)!=EOF)
{
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
for(i=0;i<strlen(x);i++)
{
if(x[i]=='.'){
t=x[i];
x[i]='\0';
strcpy(a+1,x);
strcpy(c+1,x+i+1);
x[i]=t;
break;
}
strcpy(a+1,x);
}
for(i=0;i<strlen(y);i++)
{
if(y[i]=='.'){
t=y[i];
y[i]='\0';
strcpy(b+1,y);
strcpy(d+1,y+i+1);
y[i]=t;
break;
}
strcpy(b+1,y);
}
// printf("%s!\n%s!\n%s!\n%s!\n\n",a+1,c+1,b+1,d+1);
//接下来计算 整数部分(a+b) 和小数部分(c+d)
c+d
c[0]='X';d[0]='X';//使用strlen()计算至'\0'为止.
alen=strlen(c)-1;blen=strlen(d)-1; //alen对应 c blen对应d
m=min(alen,blen);n=max(alen,blen);
for(i=1;i<=m;i++){
y[i]=c[i]-'0'+d[i]-'0';
}
if(alen>blen)
for(i=m+1;i<=n;i++) y[i]=c[i]-'0';
else for(i=m+1;i<=n;i++) y[i]=d[i]-'0';
for(y[0]=0,i=n;i>0;i--){
if(y[i]>9){
y[i]-=10;
y[i-1]++;
}
}
// if(y[0]) printf("%d",y[0]);
// for(i=1;i<=n;i++) printf("%d",y[i]);printf("\n");
// system("pause");
k=n; //因为n在下面还会继续使用 ,此处先备份 留作输出用
///a+b
a[0]='X';b[0]='X';//使用strlen()计算至'\0'为止。
alen=strlen(a)-1;blen=strlen(b)-1;
m=min(alen,blen);n=max(alen,blen);
x[0]='X';
for(i=1;i<=n-m;i++) x[i]='0'; x[i]='\0';
if(alen>blen){
strcat(x,b+1);
for(i=1;i<=alen;i++) x[i]=a[i]-'0'+x[i]-'0';
}
else{
strcat(x,a+1);
for(i=1;i<=blen;i++) x[i]=b[i]-'0'+x[i]-'0';
}
x[n]+=y[0]; //衔接小数部分的结果
for(x[0]=0,i=n;i>0;i--)
if(x[i]>9){
x[i]-=10;
x[i-1]++;
}
if(x[0]!=0) printf("%d",x[0]);
for(i=1;i<=n;i++) printf("%d",x[i]);
for(i=k;i>0;i--){
// printf("~%c~\n",y[i]);
if(y[i]!=0) break;
k=i-1;
}
if(i) printf(".");
for(i=1;i<=k;i++) printf("%d",y[i]);
printf("\n");
}
return 0;
}