题目描述
求2个浮点数相加的和 题目中输入输出中出现浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj 对于整数部分,P1P2…Pi是一个非负整数 对于小数部分,Qj不等于0
输入描述:
对于每组案例,每组测试数据占2行,分别是两个加数。
输出描述:
每组案例是n行,每组测试数据有一行输出是相应的和。
输出保证一定是一个小数部分不为0的浮点数
示例1
输入
0.111111111111111111111111111111
0.111111111111111111111111111111
输出
0.222222222222222222222222222222
题目解析:因为输入的浮点数的位数可能超过机器表示的范围,所以将浮点数作为字符串输入。两个不同的浮点数的加法,就是按位相加,所以只用补齐短的浮点数就可以了。整数是前面补0,小数是后面补0 。
代码:
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<vector>
#include<map>
#include<iomanip>
using namespace std;
int main()
{
string number1,number2;
while(cin >> number1 >> number2){
//补全数字
int len1 = number1.size();
int len2 = number2.size();
int findnumber1Int = number1.find(".") + 1; //整数的位数
int findnumber2Int = number2.find(".") + 1;
if(findnumber1Int < findnumber2Int){ //补全整数
int len = findnumber2Int - findnumber1Int;
for(int i = 0 ; i < len ; i++){
number1.insert(0,1,'0');
}
}
if(findnumber1Int > findnumber2Int){
int len = findnumber1Int - findnumber2Int;
for(int i = 0 ; i < len ; i++){
number2.insert(0,1,'0');
}
}
int findnumber1float = len1 - findnumber1Int; //小数的位数
int findnumber2float = len2 - findnumber2Int;
if(findnumber1float < findnumber2float){ //补全小数
int len = findnumber2float - findnumber1float;
for(int i = 0 ; i < len ; i++){
number1 += '0';
}
}
if(findnumber1float > findnumber2float){
int len = findnumber1float - findnumber2float;
for(int i = 0 ; i < len ; i++){
number2 += '0';
}
}
////////////////////////////////////
string result;
int k = 0;
for(int i = number1.size()-1;i >= 0; i--){
if(number1[i] == '.'){
result += number1[i];
}else{
result += char(((number1[i] - '0') + (number2[i] - '0') + k) % 10 + '0'); //本位
int r = ((number1[i] - '0') + (number2[i] - '0') + k) / 10; //进位
k = r;
}
}
for(int i = result.size() - 1;i >= 0; i-- ){
cout << result[i];
}
cout << endl;
}
return 0;
}