NYOJ 513 & HDU 1753 A+B Problem IV(模拟)

题目链接:Click here~~

一道高精度加法的题目。

由于数据中可能既有小数又有整数,所以我把整数变成小数(后面加".0"),从而化为两个小数相加的问题。

找小数点的时候,先判断它是否有末尾0,把末尾0先消去(最少保留一个)。

然后把小数点对齐,按照A+B(二)的做法先把数组倒置,然后对应位相加。

 
#include <stdio.h>
#include <string.h>
#define max(a,b) a>b?a:b
struct Num
{
    int len,back;
    char num[800];
}A,B;
void swap(char &a,char &b)
{
    a ^= b;
    b ^= a;
    a ^= b;
}
void Init(Num &c)
{
    c.len = strlen(c.num);
    char *p = strchr(c.num,'.');
    if(p == NULL)
    {
        c.num[c.len++]='.';
        c.num[c.len++]='0';
        c.back = 1;
    }
    else
    {
        int point_loc = p - c.num;
        for(int i=c.len-1;i>=point_loc+2;i--)
        {
            if(c.num[i] != '0')
                break;
            c.len--;
        }
        c.back = c.len - 1 - point_loc;
    }
}
void Reverse(Num &c)
{
    for(int i=0;i<c.len-1-i;i++)
        swap(c.num[i],c.num[c.len-1-i]);
}
void add(Num &a,Num &b)
{
    Reverse(a);
    int sub = a.back - b.back;
    int max_loc = max(sub+b.len,a.len);
    memset(a.num + a.len, '0', max_loc - a.len + 1);
    for(int i = sub;i < max_loc ;i++)
    {
        if(a.num[i]=='.')
            continue;
        int loc_b = b.len-1 - (i-sub);
        if(loc_b >= 0)
            a.num[i] += b.num[loc_b] - '0';
        if(a.num[i] > '9')
        {
            a.num[i+1]=='.' ? a.num[i+2]++ : a.num[i+1]++;
            a.num[i] -= 10;
        }
    }
    int min_loc;
    for( min_loc=0; a.num[min_loc]=='0'; min_loc++);
    max_loc = a.num[max_loc]=='0' ? max_loc-1 : max_loc;
    min_loc = a.num[min_loc]=='.' ? min_loc+1 : min_loc;
    for(int i= max_loc;i >= min_loc;i--)
        putchar(a.num[i]);
    printf("\n");
}
int main()
{
    while(~scanf("%s%s",A.num,B.num))
    {
        Init(A);
        Init(B);
        A.back > B.back ? add(A,B) : add(B,A);
    }
    return 0;
}
        


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值