记一次C++高精度加法的实现

最近因为课程拉下太多,然后再狂补C++的课程,在写洛谷的题的时候碰到了一个只是盲区:高精度运算

因为计算机识别的最长的数据类型为long long类型,数据长度为-2^62到2^62-1之间,换算为十进制就是-9223372036854775808到9223372036854775807,数据长度仅仅为19位,但是当数据长度很长的时候计算机就不能对数据进行识别,这时候数据的运算就成问题,此时应该使用高精度算法对数据进行处理。

题目来源于洛谷p1009阶乘之和:

image-20220410181846859

此处需要用到高精度加法运算,但是当初我使用的仅仅是普通long long运算,最后的结果仅仅是两个AC

后来经过学习得知,高精度加法运算需要将数字以字符串的形式存储在数组中进行运算,用数组的相对应的数位进行加法运算,在相对应的数位进行进位跟本位的转换,从而实现超长数位的加法运算

高精度加法代码附上:

 
#include <bits/stdc++.h>
using namespace std;
 
const int MAXN = 200+4; //根据题目的最大值。+4为了防止A+B出现进位
char s1[MAXN] = {};//存储字符串
char s2[MAXN] = {};//存储字符串
int a[MAXN] = {};//存储加数A
int b[MAXN] = {};//存储加数B
int c[MAXN] = {};//存储和B
 
int main() 
{
    scanf("%s %s", s1, s2);//读入字符串A
    //将字符串写入到数组A中
    int len1 = strlen(s1);
    for (int i=0; i<len1; i++) 
    {
        //倒序写入
        a[i] = s1[len1-i-1] - '0';
    }
 
    //将字符串写入到数组A中
    int len2 = strlen(s2);
    for (int i=0; i<len2; i++) 
    {
        //倒序写入
        b[i] = s2[len2-i-1] - '0';
    }
 
    //模拟竖式加法
    int jw=0;//进位
    int len = max(len1, len2)+1;//注意因为最高位可能出现进位
    for (int i=0; i<len; i++) 
    {
        c[i] = a[i] + b[i] + jw;//当前加数A位数据+加数B位位数据+上一位的进位
        jw = c[i] / 10;//本次加法是否存在进位
        c[i] %= 10;//只能保存 0 ~ 9 的数据
    }
 
    //删除前导零
    for (int i=len-1; i>=0; i--) 
    {
        //因为我们是从索引 0 开始,所以最高位是保存在 len-1
        if (0==c[i] && len>1) 
        {
            //注意要有 len>1 这个条件。考虑特殊情况,加法结果为 00,我们实际要输出 0。
            len--;
        }
        else 
        {
            //第一个不是零的最高位,结束删除
            break;
        }
    }
 
    //逆序打印输出
    for (int i=len-1; i>=0; i--) 
    {
        printf("%d", c[i]);
    }
    printf("\n");    
 
    return 0;
}

评论

  1. Yi
    3月前
    2022-7-03 2:03:07

    催更催更!

  2. Yi
    3月前
    2022-7-14 22:35:17

    更新更新 咕咕咕咕咕

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇