HDU-1753

作者: Caproner | 来源:发表于2018-12-25 22:54 被阅读0次

这个事实上就是高精度加法的模板题。
所谓高精度加法,就是在数字过大的情况下,将数字看做是数组,数组中每个值只存一位。然后对两个数组进行加法计算。
也就是说,原本的加法是对两个数相加,而高精度加法是对两个数组相加。
原理呢,就是大家小学时候学的竖式运算,模拟那个过程来做就行了。
那么在这道题目中,模拟的过程就是:把位对齐(个位对个位,十位对十位,。。。),然后逐位相加,最后进位。
思路很简单,就是代码比较难码。
相信我,这题自己从头到尾写完的话你的码力会有很大的提升的。
这里的话习惯性会使用一个结构体来模拟一个大整数。不过由于你们还没开始学面向对象编程,这里就只使用结构体+函数来做这件事情:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

// 大整数结构体 
struct BigInt
{
    int A[405]; // 整数部分。A[0]为个位,A[1]为十位,以此类推 
    int B[405]; // 小数部分。B[i]为小数点后第i+1位。
    
    // 初始化 
    void init()
    {
        memset(A,0,sizeof(A));
        memset(B,0,sizeof(B));
    } 
    
    // 将字符串转化为数字串,并划分开整数部分和小数部分 
    void Input(char *s,int len)
    {
        // 找小数点 
        int dpos=0;
        while((dpos<len)&&(s[dpos]!='.'))dpos++;
        
        // 还原整数部分
        for(int i=1;dpos-i>=0;i++)
        {
            A[i-1]=s[dpos-i]-'0';
        } 
        
        // 还原小数部分
        for(int i=1;dpos+i<len;i++)
        {
            B[i-1]=s[dpos+i]-'0';
        } 
    }
    
    // 将另一个大整数结构体加进来 
    void Add(BigInt &p)
    {
        // 直接相加 
        for(int i=0;i<405;i++)
        {
            A[i]+=p.A[i];
            B[i]+=p.B[i];
        }
        
        // 然后做进位修正
        int d=0;    // 用来存储进位
        for(int i=404;i>=0;i--)
        {
            B[i]+=d;
            d=B[i]/10;
            B[i]%=10;
        } 
        for(int i=0;i<405;i++)
        {
            A[i]+=d;
            d=A[i]/10;
            A[i]%=10;
        }
    }
    
    // 输出大整数 
    void Print()
    {
        // 先找到最高位和最低位,把前缀零和后缀零砍掉 
        int ATop=404;
        int BTop=404;
        while((ATop>=0)&&(A[ATop]==0))ATop--;
        while((BTop>=0)&&(B[BTop]==0))BTop--;
        
        // 整数部分为0的时候需要输出0,这里需要对此进行修正
        if(ATop==-1)ATop=0;
        
        for(int i=ATop;i>=0;i--)
        {
            printf("%d",A[i]);
        } 
        
        // 如果没有小数部分的话就不需要输出小数点了,所以要进行判定 
        if(BTop!=-1)
        {
            printf(".");
            for(int i=0;i<=BTop;i++)
            {
                printf("%d",B[i]);
            }
        }
        
        printf("\n");
    }
};

char sa[405],sb[405];

int main()
{
    BigInt a,b;
    while(~scanf("%s%s",sa,sb))
    {
        a.init();
        b.init();
        a.Input(sa,strlen(sa));
        b.Input(sb,strlen(sb));
        a.Add(b);
        a.Print();
    }
    return 0;
}

看完代码之后,自己试着靠自己写一遍吧。

相关文章

  • HDU-1753

    这个事实上就是高精度加法的模板题。所谓高精度加法,就是在数字过大的情况下,将数字看做是数组,数组中每个值只存一位。...

  • CUC-SUMMER-3-M

    M - 大明A+B HDU-1753 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”...

网友评论

      本文标题:HDU-1753

      本文链接:https://www.haomeiwen.com/subject/ehzqlqtx.html