Description
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。
Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。
Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。
Sample Input
1.1 2.9 1.1111111111 2.3444323343 1 1.1
Sample Output
4 3.4555434454 2.1
高精度小数相加 把小数点左右分成两部分 类似大数整相加 简单~
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <string.h>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <stdlib.h>
using namespace std;
int main()
{
char a[450],b[450];
int A[450],B[450],C[450],D[450];
while(scanf("%s%s",a,b)!=EOF)
{
int a1,a2;
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(C,0,sizeof(C));
memset(D,0,sizeof(D));
int lena=strlen(a),lenb=strlen(b);
for(int i=0; i<lena; i++)
{
if(a[i]=='.')
{
a1=i;
break;
}
a1=i;
}
for(int i=0; i<lenb; i++)
{
if(b[i]=='.')
{
a2=i;
break;
}
a2=i;
}
if(a1==lena-1)//为了方便我把两个正小数都统一成 x.x(..)的形式
{
a[a1+1]='.';
a[a1+2]='0';
a1++;
}
if(a2==lenb-1)
{
b[a2+1]='.';
b[a2+2]='0';
a2++;
}
for(int i=a1-1; i>=0; i--)
A[a1-1-i]=a[i]-'0';
for(int i=a1+1; i<lena; i++)
B[i-a1-1]=a[i]-'0';
for(int i=a2-1; i>=0; i--)
C[a2-1-i]=b[i]-'0';
for(int i=a2+1; i<lenb; i++)
D[i-a2-1]=b[i]-'0';
int lenA=a1,lenB=lena-a1-1,lenC=a2,lenD=lenb-a2-1;
lenD=max(lenB,lenD);
for(int i=lenD-1; i>=0; i--)
{
D[i]=D[i]+B[i];
if(D[i]>9&&i!=0)
{
D[i-1]++;
D[i]=D[i]%10;
}
if(D[i]>9&&i==0)
{
A[0]++;
D[i]=D[i]%10;
}
}
lenA=max(lenA,lenC);
for(int i=0; i<lenA; i++)
{
A[i]=A[i]+C[i];
if(A[i]>9)
{
A[i+1]++;
A[i]=A[i]%10;
}
}
if(A[lenA]>0) lenA++;
int m=lenD;
for(int i=m-1; i>=0; i--)
{
if(D[i]!=0) break;
if(D[i]==0) lenD--;
}
for(int i=lenA-1; i>=0; i--)
printf("%d",A[i]);
if(lenD>0) printf(".");//看小数点后面是否有数字 不能写==0 有时会是-1
for(int i=0; i<lenD; i++)
printf("%d",D[i]);
printf("\n");
}
return 0;
}