题目描述
二哥当了多年的助教,今天终于要发工资了!二哥正在高兴之际,得知工资是分两部分发放的。第一部分是这学期的工资,另一部分是之前所有学期的工资总和。而领取工资时,出纳员会问二哥,两部分工资加在一起是多少,如果二哥回答错了,就只能领到这个学期的工资之前所有学期的劳动就白费了。
二哥从小道消息得知,出纳员是个对数字敏感的人,不能有一点差错,所以二哥需要一个程序来帮他算出精确的工资总和。
输入格式
输入共两行,每行是一个十进制表示的工资金额(没有正负号,小数点后有两位数字)。
输出格式
输出共一行,即精确的工资总和(没有正负号,小数点后有两位数字)。
说明
工资金额的有效数字位数不超过200位,并保证有小数点。
Sample Input
Sample Output
思路
整体思路使用字符数组代替double类型实现大整数的相加,需要注意的地方是:
- 小数点符号不参与运算
- 最高位进位后要记得输出
#include <stdio.h> #include "stdlib.h" #include "math.h"
int main(int argc, const char * argv[]) {
int max = 0, m=0, n=0,k; int carry = 0; int sum=0; int temp = 0;
int a[200] = {}; int b[200] = {}; int result[210] = {};
while ((temp=getchar())!='\n') { a[m] = temp-'0'; m++; }
while ((temp=getchar())!='\n') { b[n] = temp-'0'; n++; }
max = n>m?n:m;
for (k = 0; k < max; k++) {
if (k!=2) {
if (k>=n) { result[k] = a[m-k-1] + carry; }else if (k>=m){ result[k] = b[n-k-1] + carry; }else{ result[k] = a[m-k-1] + b[n-k-1] + carry; }
if (result[k]>=10) { result[k] = result[k]%10; carry = 1; }else{ carry = 0; }
}else{
} }
if (carry==1) { printf("1"); }
for (k = 0; k < max; k++) { if (k==max-3) { printf("."); }else{ printf("%d",result[max-k-1]); } }
return 0; }
|