题目描述
二哥当了多年的助教,今天终于要发工资了!二哥正在高兴之际,得知工资是分两部分发放的。第一部分是这学期的工资,另一部分是之前所有学期的工资总和。而领取工资时,出纳员会问二哥,两部分工资加在一起是多少,如果二哥回答错了,就只能领到这个学期的工资之前所有学期的劳动就白费了。
二哥从小道消息得知,出纳员是个对数字敏感的人,不能有一点差错,所以二哥需要一个程序来帮他算出精确的工资总和。
输入格式
输入共两行,每行是一个十进制表示的工资金额(没有正负号,小数点后有两位数字)。
输出格式
输出共一行,即精确的工资总和(没有正负号,小数点后有两位数字)。
说明
工资金额的有效数字位数不超过200位,并保证有小数点。
Sample Input
123.45
543.21
Sample Output
666.66
代码
#include <iostream>
#include <string>
using namespace std;
int main1007() {
string s1, s2;
cin >> s1 >> s2;
// 数字长度(不包括小输点)
int l1 = s1.size() - 1;
int l2 = s2.size() - 1;
int c1[l1] = {}, c2[l2] = {};
int k = l1;
for(int i = 0; i < l1 ; ) { // 注意字符串转数字(-'0')
if(k != l1 - 2) { // 去掉小数点
c1[i] = s1.at(k) - '0';
i++;
}
k--;
}
k = l2;
for(int i = 0; i < l2; ) {
if(k != l2 - 2) {
c2[i] = s2.at(k) - '0';
i++;
}
k--;
}
int l = l1 > l2 ? l1 : l2;
int sum[l + 1] = {0}, c[l] = {0}; // sum和进位
int i = 1;
sum[0] = c1[0] + c2[0];
c[0] = sum[0] > 9 ? 1 : 0;
sum[0] = sum[0] > 9 ? sum[0] - 10 : sum[0];
if(l1 > l2) {
for(; i < l2; i++) { // 公共部分求和
sum[i] = c1[i] + c2[i] + c[i - 1];
c[i] = sum[i] > 9 ? 1 : 0;
sum[i] = sum[i] > 9 ? sum[i] - 10 : sum[i];
}
for(; i < l1; i++) { // 多出部分求和
sum[i] = c1[i] + c[i - 1];
c[i] = sum[i] > 9 ? 1 : 0;
sum[i] = sum[i] > 9 ? sum[i] - 10 : sum[i];
}
}
else {
for(; i < l1; i++) {
sum[i] = c1[i] + c2[i] + c[i - 1];
c[i] = sum[i] > 9 ? 1 : 0;
sum[i] = sum[i] > 9 ? sum[i] - 10 : sum[i];
}
for(; i < l2; i++) {
sum[i] = c2[i] + c[i - 1];
c[i] = sum[i] > 9 ? 1 : 0;
sum[i] = sum[i] > 9 ? sum[i] - 10 : sum[i];
}
}
sum[i] = c[i - 1]; // 最高位求和
// 逆向输出求和结果
int m = l;
if(sum[m] == 0) m = l - 1; //最高位的0不输出
for( ; m >= 0; m--) {
if(m == 1) cout << ".";
cout << sum[m];
}
return 0;
}
·编程注意问题
1.输入时小数长度200位,只能通过字符进行操作,其中注意“.”的处理;
2.字符类型转数字,通过c-'0';
3.求和以及进位的处理;
4.相加时,需要从最低位开始对齐相加;
5.小数长度不同时,需要对多出小数进行处理;
6.逆序输出,并且去除首零。