蓝桥4-R格式-1

zzzxyy / 2024-09-26 / 原文

知识铺垫(高精度算法):
在C/C++中,我们经常会碰到限定数据范围的情况,
C++规定:
int占32位,即4个字节,即int的范围是[-231,231-1],为10^9数量级
long long占64位,即8个字节,即long long的范围是[-263,263-1],为10……18数量级
如果超过该数量级,则需引入高精度算法。
1.高精度加法

A+B Problem(高精)

题目描述

高精度加法,相当于 a+b problem,不用考虑负数

输入格式

分两行输入。a,b<=10^500。

输出格式

输出只有一行,代表 $a+b$ 的值。

样例 #1

样例输入 #1

1
1

样例输出 #1

2

样例 #2

样例输入 #2

1001
9099

样例输出 #2

10100

提示

$20%$ 的测试数据,0<=a,b<=10^9;

$40%$ 的测试数据,0<=a,b<=10^18。

#include<cstring>
char s1[505],s2[505];
int a[505],b[505],c[505];
using namespace std;
int main()
{
    int la,lb,lc;// la: s1的长度, lb: s2的长度, lc: 结果的长度

    // 输入两个大数的字符串表示
    cin>>s1;
    cin>>s2;

    // 计算输入字符串的长度
    la=strlen(s1);
    lb=strlen(s2);

     // 将第一个字符串的数字转换为整数数组(反向存储)
    for(int i=0; i<la; i++)
    {
        a[la-i]=s1[i]-'0'; // s1[i] 转换为数字并存储在 a 中
    }

     // 将第二个字符串的数字转换为整数数组(反向存储)
    for(int i=0; i<lb; i++)
    {
        b[lb-i]=s2[i]-'0';// s2[i] 转换为数字并存储在 b 中
    }

    // 设置结果的最大可能长度
    lc=max(la,lb)+1;// 加一是为了处理可能的进位

    // 进行大数相加
    for(int i=1; i<=lc; i++)
    {
        c[i]+=a[i]+b[i];// 对应位相加
        c[i+1]=c[i]/10;// 计算进位
        c[i]=c[i]%10; // 当前位数值
    }

    // 去掉结果前面的零
    if(c[lc]==0&&lc>0)lc--;

    // 输出最终结果
    for(int i=lc; i>0; i--)
        cout<<c[i];// 从高位到低位输出

    return 0;

}