超大数求和(SJTU OJ 1007)

题目描述

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

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

输入格式

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

输出格式

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

说明

工资金额的有效数字位数不超过200位,并保证有小数点。

Sample Input

123.45
543.21

Sample Output

666.66


思路

整体思路使用字符数组代替double类型实现大整数的相加,需要注意的地方是:

  1. 小数点符号不参与运算
  2. 最高位进位后要记得输出
//
// main.c
// calculation
//
// Created by Oscar on 11/09/2017.
// Copyright © 2017 刘丰瑞. All rights reserved.
//

#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;
}