Online Judge——1007. 二哥领工资(c++)

题目描述

二哥当了多年的助教,今天终于要发工资了!二哥正在高兴之际,得知工资是分两部分发放的。第一部分是这学期的工资,另一部分是之前所有学期的工资总和。而领取工资时,出纳员会问二哥,两部分工资加在一起是多少,如果二哥回答错了,就只能领到这个学期的工资之前所有学期的劳动就白费了。

二哥从小道消息得知,出纳员是个对数字敏感的人,不能有一点差错,所以二哥需要一个程序来帮他算出精确的工资总和。

输入格式

输入共两行,每行是一个十进制表示的工资金额(没有正负号,小数点后有两位数字)。

输出格式

输出共一行,即精确的工资总和(没有正负号,小数点后有两位数字)。

说明

工资金额的有效数字位数不超过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.逆序输出,并且去除首零。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值