本文主要是介绍浮点数加法【北京大学】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接
54.87
674.92
首先用字符串读入,把整数部分z和小数部分x分开存放在数组中,并记录长度zl和xl
首先将小数部分相加,从后往前加;然后保留进位carry。
整数部分先逆序变成
45
476
然后从前往后加,注意加到最大长度后,需要判断进位carry是否为0,不为0时,还需要进位。
最后输出,整数部分逆序输出,小数部分正序输出。
#include<bits/stdc++.h>
using namespace std;
struct F{int z[1005],x[1005];int zl,xl;F(){memset(z,0,sizeof(z));memset(x,0,sizeof(x));zl=0,xl=0;}
};
int main(){string str1,str2;F a,b,c;while(cin>>str1>>str2){int flag=0;//str1 for(int i=0;i<str1.size();i++){ //将字符串浮点数转换为整数部分和小数部分 if(str1[i] == '.'){flag=1;continue;}if(flag==0){a.z[a.zl++] = str1[i] - '0';}else{a.x[a.xl++] = str1[i] - '0';}}//str2flag=0;for(int i=0;i<str2.size();i++){ //将字符串浮点数转换为整数部分和小数部分 if(str2[i] == '.'){flag=1;continue;}if(flag==0){b.z[b.zl++] = str2[i] - '0';}else{b.x[b.xl++] = str2[i] - '0';}}//先求小数部分的和 int carry=0; //进位c.xl = max(a.xl, b.xl);for(int i=0;i<a.xl ||i<b.xl;i++){c.x[c.xl-1-i] = (a.x[c.xl-1-i] + b.x[c.xl-1-i] + carry) % 10;carry = (a.x[c.xl-1-i] + b.x[c.xl-1-i] + carry) / 10;}c.zl = max(a.zl, b.zl);reverse(a.z, a.z + a.zl);reverse(b.z, b.z + b.zl);for(int i=0;i<a.zl ||i<b.zl;i++){c.z[i] = (a.z[i] + b.z[i] + carry) % 10;carry = (a.z[i] + b.z[i] + carry) / 10;}if(carry!=0) c.z[c.zl++] = 1;for(int i=c.zl-1;i>=0;i--){cout<<c.z[i];}cout<<".";for(int i=0;i<c.xl;i++){cout<<c.x[i];} cout<<endl;}return 0;
}
这篇关于浮点数加法【北京大学】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!