zoukankan      html  css  js  c++  java
  • 洛谷【P1601】A+B Problem(高精)

    题目传送门:https://www.luogu.org/problemnew/show/P1601

    高精度加法板子。我们灵性地回忆一波小学学加法列竖式的场景(从(6)岁开始口算从未打过草稿的大佬请出门左转)。

    我们用(a)(b)数组存加数,(c)数组存和。根据加法法则,(c[i]=a[i]+b[i]),如果(c[i]>10)就要进位。

    然后再存一下每一个数的长度就可以了。建议用结构体,因为结构体重载运算符很舒服。

    时间复杂度:(O(len))

    空间复杂度:(O(len))

    代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    char s[505];
    
    struct Bignum {
        int num[505];
    
        void make() {
            num[0]=strlen(s+1);//num[0]存长度,num[1]存个位数,num[2]存十位数...
            for(int i=1;i<=num[0];i++)
                num[i]=s[num[0]-i+1]-'0';//跟快读一样处理字符
        }
    
        Bignum operator+(const Bignum &fake)const {
            Bignum c;memset(c.num,0,sizeof(c.num));//记得要memset,不然就挂飞了
            c.num[0]=max(num[0],fake.num[0]);//更新长度
            for(int i=1;i<=c.num[0];i++) {
                c.num[i]+=num[i]+fake.num[i];
                c.num[i+1]+=c.num[i]/10;c.num[i]%=10;//记得是+=不是=
            }
            if(c.num[c.num[0]+1])c.num[0]++;//如果进位进到下一位去了那就长度++
            return c;//由于最多是三个一位数相加,所以不可能加出三位数,所以只要一个if就可以了
        }
    
        void print() {
            for(int i=num[0];i;i--)
                printf("%d",num[i]);
        }
    }a,b,c;
    
    int main() {
        scanf("%s",s+1);a.make();
        scanf("%s",s+1);b.make();//以字符串的形式读入再转化到数组里。
        c=a+b;c.print();//重载运算符后直接输出
        return 0;
    }
    
  • 相关阅读:
    关于 js 下载PDF文件时
    vue3.0 学习
    iOS
    bootstrap treeview
    SVN版本管理
    js框架
    正则表达式
    如何让安卓手机在电脑上同步显示(MX4 Pro为例)
    mysql 中文乱码
    ADO.NET 数据库连接池大小
  • 原文地址:https://www.cnblogs.com/AKMer/p/9722610.html
Copyright © 2011-2022 走看看