#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> ve;
void getsum(string a,string b)
{
ve.clear();
int i,j;
i=j=0;
while(a[i]!='.')i++;
while(b[j]!='.')j++;
int alenl=i-1;
int blenl=j-1;
int alenr=a.size()-i;
int blenr=b.size()-j;
int dot=0;
if(alenr>blenr)
{
dot=alenr;
for(int i=0;i<alenr-blenr;i++)
b+='0';
}else
{
dot=blenr;
for(int i=0;i<blenr-alenr;i++)
a+='0';
}
i=a.size()-1;
j=b.size()-1;
int inc=0;
while(i>=0&&j>=0)
{
if(a[i]=='.')
{
i--;j--;
continue;
}
int k=a[i]-'0'+b[j]-'0'+inc;
int newk=k%10;
inc=k/10;
ve.push_back(newk);
i--;
j--;
}
while(i>=0)
{
int k=a[i]-'0'+inc;
int newk=k%10;
inc=k/10;
ve.push_back(newk);
i--;
}
while(j>=0)
{
int k=b[j]-'0'+inc;
int newk=k%10;
inc=k/10;
ve.push_back(newk);
j--;
}
if(inc>0)
ve.push_back(inc);
i=0;
while(ve[i]==0)i++;
int sumsize=ve.size()-i;
reverse(ve.begin(),ve.end());
dot=ve.size()-dot+1;
i=0;
while(ve[i]=='0')i++;
for(;i<dot;i++)
{
cout<<ve[i];
}
cout<<".";
for(;i<sumsize;i++)
cout<<ve[i];
cout<<endl;
}
void func()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
string a,b;
cin>>a>>b;
getsum(a,b);
}
}
}
int main(int argc, char *argv[])
{
//printf("Hello, world\n");
func();
return 0;
}
关键在小数点,计算对齐,前置0和后置0
-
题目描述:
-
求2个浮点数相加的和
题目中输入输出中出现浮点数都有如下的形式:
P1P2...Pi.Q1Q2...Qj
对于整数部分,P1P2...Pi是一个非负整数
对于小数部分,Qj不等于0
-
输入:
-
对于每组案例,第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。
每组测试数据之间有一个空行,每行数据不超过100个字符
-
输出:
-
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
-
样例输入:
-
2 0.111111111111111111111111111111 0.111111111111111111111111111111 10000000.655555555555555555555555555555 1.444444444444444444444444444445
-
样例输出:
-
0.222222222222222222222222222222 10000002.1