//这道题比较麻烦但不难,如果掌握大数的加法乘法,那这道题就是代码多点 #include "stdio.h" #include "string" #include "algorithm" using namespace std; string addString1(string num1,string num2,int &carry){//小数加法 int length = num1.size()>num2.size()?num1.size():num2.size(); while (num1.size() < length)//将二者的位数补齐(低位补齐) num1 += "0"; while (num2.size() < length) num2 += "0"; string num3 = "";int temp; for (int i = length-1; i >= 0; --i) { temp = num1[i]-'0' + num2[i]-'0'+carry; if(temp > 9){ carry = 1; num3 += temp - 10 + '0'; } else{ num3 += temp + '0'; carry = 0; } } int i = 0; while (num3[i] == '0'){//消除低位的0 ++i; } num3.erase(0,i);//低位多出来的0舍去 reverse(num3.begin(),num3.end());//算的时候是按反着存的,所以倒回来 return num3; } string addString2(string num1,string num2,int &carry){//整数加法 int length = num1.size()>num2.size()?num1.size():num2.size(); while (num1.size() < length)//高位补齐 num1 = "0" + num1; while (num2.size() < length) num2 = "0" + num2; string num3 = "";int temp; for (int i = length-1; i >= 0; --i) { temp = num1[i]-'0' + num2[i]-'0' + carry; if (temp > 9){ carry = 1; num3 += temp-10+'0'; } else{ num3 += temp+'0'; carry = 0; } } if (carry == 1) num3 += carry+'0';//最高位>9后要产生更高的一位 reverse(num3.begin(),num3.end());//算的时候是按反着存的,所以倒回来 return num3; } int main(){ char buf1[1000],buf2[1000]; while (fgets(buf1,1000,stdin)!=NULL){ fgets(buf2,1000,stdin); string num1_entire = buf1,num2_ebtire = buf2; num1_entire.pop_back();num2_ebtire.pop_back(); int pos1 = num1_entire.find('.');//记录第一个数的小数点位置 int pos2 = num2_ebtire.find('.');//记录第二个数的小数点位置 string num1_part1 = num1_entire.substr(0,pos1);//得到第一个数的小数点前面的部分 string num1_part2 = num1_entire.substr(pos1+1);//得到第一个数的小数点后面的部分 string num2_part1 = num2_ebtire.substr(0,pos2);//得到第二个数的小数点前面的部分 string num2_part2 = num2_ebtire.substr(pos2+1);//得到第二个数的小数点后面的部分 /* * 之后的思路是是先将小数点后面的字符串相加,再将小数点前面的字符串相加 */ int carry = 0;//存储进位信息 string num3_part2 = addString1(num1_part2,num2_part2,carry); string num3_part1 = addString2(num1_part1,num2_part1,carry); string num3_entire = num3_part1+'.'+num3_part2; printf("%s\n",num3_entire.c_str()); } }