Description
给你两个正的小数A和B,你的任务是计算出A+B的值。
************************************************************************************************
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
************************************************************************************************
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
************************************************************************************************
1.1 2.9
1.1111111111 2.3444323343
1 1.1
************************************************************************************************
4
3.4555434454
2.1
************************************************************************************************
思路,就是按照两数相减的思路,就可以了。我采用的c语言版的!
************************************************************************************************
代码如下:
#include<stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
char a[405],b[405];
char x[200],y[200],z[200],k[200];
int p[405],q[405];
///判断是不是含有小数点,随便解决多余的0
int fun(char s[])
{
int q=0;
for(int i=0; i<strlen(s); i++)
{
if(s[i]=='.')
{
q = i;
break;
}
}
if(q==1)
{
int i=strlen(s)-1;
while(s[i]=='0')
{
s[i] = '\0';
i--;
}
if(s[i]=='.')
{
s[i]='\0';
return 0;
}
}
return q;
}
void cmp(int lena,int t)
{
if(t==1)
{
///表示有小数点,
if(lena!=0)
{
for(int i=0; i<lena; i++)
x[i] = a[i];
x[lena] = '\0';
int j=0;
for(int i=lena+1; i<strlen(a); i++,j++)
y[j] = a[i];
y[j]='\0';
}
else
///无小数点
strcpy(x,a);
}
else
{
///表示有小数点,
if(lena!=0)
{
for(int i=0; i<lena; i++)
z[i] = b[i];
z[lena] ='\0';
int j=0;
for(int i=lena+1; i<strlen(b); i++,j++)
k[j] = b[i];
k[j]='\0';
}
else
///无小数点
strcpy(z,b);
}
}
void xiangjia(int len,int num,int t)
{
int o = num-1;
if(t==1)
{
for(int i = len-1 ; i>=0 ; i--,o--)
p[o] = x[i]-'0';
for(int i = 0 ; i<strlen(z) ; i++)
p[i] += z[i]-'0';
}
else
{
for(int i = len-1 ; i>=0 ; i--,o--)
p[o] = z[i]-'0';
for(int i = 0 ; i<strlen(x) ; i++)
p[i] += x[i]-'0';
}
}
int wh(int l)
{
int index =0;
int i;
for( i = l-1; i>=0; i--)
{
if(q[i] == 0 && index==0)
continue;
else
break;
}
for(int j=0; j<=i; j++)
{
if(index==0)
{
printf(".");
index=1;
}
printf("%d",q[j]);
}
printf("\n");
}
int main()
{
int lena,lenb;
while(scanf("%s %s",&a,&b)!=EOF)
{
memset(x,0,sizeof(x));
memset(z,0,sizeof(z));
memset(y,0,sizeof(y));
memset(k,0,sizeof(k));
memset(q,0,sizeof(q));
memset(p,0,sizeof(p));
int funa = fun(a);
int funb = fun(b);
cmp(funa,1);
cmp(funb,2);
///前面一部分相加的结果
int lenx = strlen(x);
int lenz = strlen(z);
int j = lenx>lenz?lenx:lenz;
if(j!=lenx)
xiangjia(lenx,j,1);
else
xiangjia(lenz,j,2);
for(int i=j-1; i>0; i--)
{
if(p[i]>=10)
{
p[i-1]+=p[i]/10;
p[i]=p[i]%10;
}
}
///后一部分相加的结果
int l = strlen(k)>strlen(y)?strlen(k):strlen(y);
for(int i=0; i<strlen(k); i++)
q[i] = k[i]-'0';
for(int i=0; i<strlen(y); i++)
q[i] += y[i]-'0';
///之前的
for(int i=l-1; i>0; i--)
{
if(q[i]>=10)
{
q[i-1] += q[i]/10;
q[i] = q[i]%10;
}
}
///合并了得最后的值
if(q[0]>=10)
{
int num = q[0]/10;
q[0] = q[0]%10;
int i = j-1;
p[i] += num;
while(p[i]>=10 && i>0)
{
p[i-1] += p[i]/10;
p[i] = p[i]%10;
i--;
}
}
///输出前面的头部
for(int i=0; i<j; i++)
printf("%d",p[i]);
///尾部调用输出
wh(l);
}
return 0;
}