浮点数加法
刷题链接: link.
题目描述
求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0
输入描述:
对于每组案例,每组测试数据占2行,分别是两个加数。
输出描述:
每组案例是n行,每组测试数据有一行输出是相应的和。输出保证一定是一个小数部分不为0的浮点数
输入:
0.111111111111111111111111111111
0.111111111111111111111111111111
输出:
0.222222222222222222222222222222
我的思路:整数部分和小数部分,分开计算,数位对齐是关键,使用了一个vector来存储,比较冗余。
我的代码:
#include<cstdio>
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> x,y;
vector<char> z;
string a,b;
cin>>a>>b;
int la=a.size(),lb=b.size();
int za=a.find("."),zb=b.find("."),mm;
if(za>zb)
{
mm=za;
int t=za-zb;
while(t--)
y.push_back(0);
}
else
{
mm=zb;
int t=zb-za;
while(t--)
x.push_back(0);
}
for(int i=0;i<la;i++)
x.push_back(a[i]-'0');
for(int i=0;i<lb;i++)
y.push_back(b[i]-'0');
int lx=x.size(),ly=y.size();
int l=max(lx,ly);
int m=0,n=0;
for(int i=l-1;i>mm;i--)
{
m=n;
if(i<lx)
m=m+x[i];
if(i<ly)
m=m+y[i];
z.push_back(m%10+'0');
n=m/10;
}
z.push_back('.');
for(int i=mm-1;i>=0;i--)
{
int t=n+x[i]+y[i];
z.push_back(t%10+'0');
n=t/10;
}
if(n>0)
z.push_back(n+'0');
for(int i=z.size()-1;i>=0;i--)
printf("%c",z[i]);
return 0;
}
参考思路:思路相同,参考代码更加简洁,直接使用string函数的插入,以及continue函数使用。
参考代码:
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int main()
{
string a,b;
while(cin>>a>>b)
{
int za=a.find('.'),zb=b.find('.');
if(za>zb)
b.insert(0,za-zb,'0');
else
a.insert(0,zb-za,'0');
int la=a.size(),lb=b.size();
if(la>lb)
b.insert(lb,la-lb,'0');
else
a.insert(la,lb-la,'0');
int l=a.size();
int t=0;
for(int i=l-1;i>=0;i--)
{
if(a[i]=='.')
continue;
a[i]+=(b[i]-'0')+t;
t=(a[i]-'0')/10;
a[i]=(a[i]-'0')%10+'0';
}
if(t>0)
a.insert(0,1,'1');
cout<<a<<endl;
}
return 0;
}