1007. 二哥领工资
题目描述
二哥当了多年的助教,今天终于要发工资了!二哥正在高兴之际,得知工资是分两部分发放的。第一部分是这学期的工资,另一部分是之前所有学期的工资总和。而领取工资时,出纳员会问二哥,两部分工资加在一起是多少,如果二哥回答错了,就只能领到这个学期的工资之前所有学期的劳动就白费了。
二哥从小道消息得知,出纳员是个对数字敏感的人,不能有一点差错,所以二哥需要一个程序来帮他算出精确的工资总和。
输入格式
输入共两行,每行是一个十进制表示的工资金额(没有正负号,小数点后有两位数字)。
输出格式
输出共一行,即精确的工资总和(没有正负号,小数点后有两位数字)。
说明
工资金额的有效数字位数不超过200位,并保证有小数点。
Sample Input
123.45
543.21
Sample Output
666.66
分析
200位输入,不能使用double,只是用字符串来进行大数相加。
#include <stdio.h>
int main()
{
char a[210], b[210];
int len_a, len_b;
char sum[210];
char tmp;
int len_sum;
int i, j;
char flag=0;
for(len_a=0; (a[len_a]=getchar())!='\n';) {
if(a[len_a]!='.')
len_a++;
}
for(len_b=0; (b[len_b]=getchar())!='\n';) {
if(b[len_b]!='.')
len_b++;
}
len_sum=0;
if(len_a<len_b)
{
for(i=len_a-1, j=len_b-1; i>=0; i--, j--) {
tmp=a[i]+b[j]+flag-'0';
if(tmp>'9') {
flag=1;
sum[len_sum]=tmp-10;
}
else {
sum[len_sum]=tmp;
flag=0;
}
len_sum++;
}
for(; j>=0; j--) {
tmp=b[j]+flag;
if(tmp>'9') {
flag=1;
sum[len_sum]=tmp-10;
}
else {
sum[len_sum]=tmp;
flag=0;
}
len_sum++;
}
if(flag) {
sum[len_sum]='1';
len_sum++;
}
}
else
{
for(i=len_b-1, j=len_a-1; i>=0; i--, j--) {
tmp=b[i]+a[j]+flag-'0';
if(tmp>'9') {
flag=1;
sum[len_sum]=tmp-10;
}
else {
sum[len_sum]=tmp;
flag=0;
}
len_sum++;
}
for(; j>=0; j--) {
tmp=a[j]+flag;
if(tmp>'9') {
flag=1;
sum[len_sum]=tmp-10;
}
else {
sum[len_sum]=tmp;
flag=0;
}
len_sum++;
}
if(flag) {
sum[len_sum]='1';
len_sum++;
}
}
for(i=len_sum-1; i>=0; i--) {
if(i==1)
putchar('.');
putchar(sum[i]);
}
return 0;
}
网友评论