AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 791. 高精度加法C++数组实现    原题链接    简单

作者: 作者的头像   lyclyc_NSP ,  2020-05-10 11:35:23 ,  所有人可见 ,  阅读 24389


104


26

题目描述

高精度加法


样例

$a, b$ 均为正整数


C++ 代码

#include <iostream>
using namespace std;

const int N = 100010;
int A[N], B[N], C[N];

int Add(int a[], int b[], int c[], int cnt) {

    int t = 0;//t表示进位

    for (int i=1; i<=cnt; i++) {
        t += a[i] + b[i];//进位加上a和b第i位上的数
        c[i] = t % 10;//c的值就是进位的个位数
        t /= 10;//把t的个位数去掉只剩下十位数,即只剩下这个位置的进位
    }
    if (t) c[++cnt] = 1;//如果t==1,表示还有一个进位,要补上

    return cnt;
}

int main() {

    string a, b;
    cin >> a >> b;  


    //A和B倒着放进int数组,因为有进位,倒着放容易处理
    int cnt1 = 0;
    for (int i=a.size()-1; i>=0; i--)
        A[++cnt1] = a[i] - '0';

    int cnt2 = 0;
    for (int i=b.size()-1; i>=0; i--)
        B[++cnt2] = b[i] - '0';

    int tot = Add(A, B, C, max(cnt1, cnt2));

    //因为A和B是倒着放的,所以C也要倒着输出
    for (int i=tot; i>=1; i--)
        cout << C[i];
}

44 评论


用户头像
懒惰的蚩蚩   2022-07-19 20:06      8    踩      回复

写得非常棒!!


用户头像
夕暮   2022-10-17 22:16      2    踩      回复

if (t) c[++cnt] = 1;//如果t==1,表示还有一个进位,要补上 这句什么意思??没怎么明白

用户头像
Dɪsᴛᴀɴᴄᴇ   2023-03-07 09:44      1    踩      回复

前一位相加进位最大为1,因为每位上数最大为9


用户头像
晒干了沉默   2022-03-09 21:33      2    踩      回复

是因为stl不香吗,偏偏要用数组

用户头像
半夜不学算法   2023-07-07 12:15      3    踩      回复

数组的效率比vector要高一些

用户头像
Paul_8   4个月前    回复了 半夜不学算法 的评论         踩      回复

高精度加法中,如果进位,写成下面可以吗?n表示的是进制,比如n是10。
if(a[i]>=n)
{
a[i+1]++;
a[i]-=n;
}

还是说必须得写成:
if(a[i]>=n)
{
a[i+1]+=a[i]/n;
a[i]%=n;
}


用户头像
Paul_8   4个月前         踩      回复

高精度加法中,如果进位,写成下面可以吗?n表示的是进制,比如n是10。
if(a[i]>=n)
{
a[i+1]++;
a[i]-=n;
}

还是说必须得写成:
if(a[i]>=n)
{
a[i+1]+=a[i]/n;
a[i]%=n;
}


用户头像
仙闻   9个月前         踩      回复

问一下,数组刚开始没有全部赋值为零,不会产生随机的数吗?

用户头像
fuhz0709   9个月前      2    踩      回复

在主函数外开数组全部都会默认成0

用户头像
仙闻   9个月前    回复了 fuhz0709 的评论      1    踩      回复

多谢,真的解决了我一直的问题!


用户头像
图灵酱   2023-09-26 10:57         踩      回复

数组版本的空间复杂度高吧


用户头像
好好学习_98   2023-07-19 16:16         踩      回复

cnt是什么意思,没有搞懂

用户头像
君に会いたい   2023-07-26 08:59         踩      回复

我也是,不懂

用户头像
童蒙   2023-09-15 10:01      1    踩      回复

数字记录成数组,用cnt记录数位长度,要选择最长的那个作为两数之和的数位长度,所以最后如果要进位的话,还需要cnt++


用户头像
316   2023-03-28 17:28         踩      回复

为什么要用vector[HTML_REMOVED]定义A,B,C?


用户头像
随遇而安_42   2023-03-21 12:45         踩      回复

我想问问if(t)啥意思

用户头像
好好学习_98   2023-07-19 16:24         踩      回复

你可以理解成if(t==1)吧,和题主标注的意思差不多

用户头像
劲能神佑   2023-08-30 19:43      1    踩      回复

意思是if(t != 0)

用户头像
Paul_8   4个月前    回复了 好好学习_98 的评论         踩      回复

高精度加法中,如果进位,写成下面可以吗?n表示的是进制,比如n是10。
if(a[i]>=n)
{
a[i+1]++;
a[i]-=n;
}

还是说必须得写成:
if(a[i]>=n)
{
a[i+1]+=a[i]/n;
a[i]%=n;
}


用户头像
Bianca   2022-09-21 11:39         踩      回复

这个开的数组存的了位数是100000的吗,不是数字大小100000,这开的对吗

用户头像
霉菌素   2022-11-09 18:02      1    踩      回复

vector是变长数组,不用特意指定数组容量,他最多可以存大概10^9个数


用户头像
牛马阳msun   2022-03-20 15:33         踩      回复

感觉最后的进位t有可能不是1 直接 c[++cnt] =t就好

用户头像
www777   2022-05-12 16:01      4    踩      回复

9+9也才18啊。。。进位最大就是1


用户头像
闲看白云   2022-01-14 18:41         踩      回复

为什么要a[i]-‘0’;是什么说法

用户头像
Jsweet   2022-01-14 19:06      5    踩      回复

存的时候是字符要改成数字

用户头像
闲看白云   2022-01-14 20:16    回复了 Jsweet 的评论         踩      回复

懂了懂了


用户头像
刷完acw周赛计划   2021-06-04 16:15         踩      回复

不懂就问,为什么数组要从1开始存数据

用户头像
路人_7   2022-01-08 14:57         踩      回复

可以是0啊,我习惯上数组从0 开始
#include [HTML_REMOVED]
#include[HTML_REMOVED]
const long N = 100000;
using namespace std;
void Add(int a[], int b[], int c[], int &n)
{
int t = 0;
for (int i = 0; i < n; i )
{
t += a[i] + b[i];
c[i] = t % 10;
t = (int ) t / 10;
}
if (t > 0) c[n
] = t;
}
int main()
{
string a, b;
int addA[N] = {0}, addB[N] = {0}, result[N] = {0};
int n = 0;
cin >> a >> b;
if (a.size() > b.size()) n = a.size(); else n = b.size();
for (int i = 0; i < a.size(); i ++) addA[a.size() - i - 1] = a[i] - ‘0’;
for (int i = b.size() - 1; i >= 0; i –) addB[b.size() - i - 1] = b[i] - ‘0’;
Add(addA, addB, result, n);
for (int i = n - 1; i >= 0; i –)
printf(“%c”, result[i] + ‘0’);
return 0;
}

用户头像
路人_7   2022-01-08 14:57    回复了 路人_7 的评论         踩      回复

不知道为什么输出变这样了 ,将就着看吧

用户头像
路人_7   2022-01-08 15:08    回复了 路人_7 的评论         踩      回复

第12行是n ,不知道为什么 消失了

用户头像
路人_7   2022-01-08 15:08    回复了 路人_7 的评论         踩      回复

n 加加

用户头像
陌上花开Charlie   2022-07-04 11:12    回复了 路人_7 的评论         踩      回复

加上三个 ` 就好了

include [HTML_REMOVED]
include[HTML_REMOVED]
const long N = 100000;
using namespace std;
void Add(int a[], int b[], int c[], int &n)
{
int t = 0;
for (int i = 0; i < n; i )
{
t += a[i] + b[i];
c[i] = t % 10;
t = (int ) t / 10;
}
if (t > 0) c[n ] = t;
}
int main()
{
string a, b;
int addA[N] = {0}, addB[N] = {0}, result[N] = {0};
int n = 0;
cin >> a >> b;
if (a.size() > b.size()) n = a.size(); else n = b.size();
for (int i = 0; i < a.size(); i ++) addA[a.size() - i - 1] = a[i] - ‘0’;
for (int i = b.size() - 1; i >= 0; i –) addB[b.size() - i - 1] = b[i] - ‘0’;
Add(addA, addB, result, n);
for (int i = n - 1; i >= 0; i –)
printf(“%c”, result[i] + ‘0’);
return 0;
}
用户头像
Love_cheng   2022-08-25 10:42    回复了 陌上花开Charlie 的评论         踩      回复

对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对对


用户头像
一只小锦李   2021-01-25 20:41         踩      回复

cnt为两个数长度最大的那个,假如cnt1>cnt2,那短的B[cnt]的值是什么,为零吗

用户头像
RwChen   2021-09-07 20:38         踩      回复

是的,你看100写成0000100也可以只是平时没必要,也没人这么写

用户头像
sjk   2022-05-19 10:40    回复了 RwChen 的评论         踩      回复

最好加一个memset,初始化一下

用户头像
Love_cheng   2022-08-25 10:41    回复了 sjk 的评论      1    踩      回复

100000100000100000


用户头像
rech   2021-01-17 20:33         踩      回复

我慕了,用数组的效率是向量的两倍
用向量平均要80ms,用数组的话效率平均40ms

用户头像
996   2022-03-30 18:17         踩      回复

到后面y总都是用数组模拟讲的hh 因为数据结构数组模拟大都比STL快

用户头像
Jimsonna   2022-09-22 20:40    回复了 996 的评论         踩      回复

在哪看y总数组模拟的代码


用户头像
cht   2020-05-10 11:43         踩      回复

大佬啊

用户头像
lyclyc_NSP   2020-05-10 11:43         踩      回复

我在摸鱼啊

用户头像
aa   2020-05-10 13:06         踩      回复

123

用户头像
cht   2020-05-10 16:30    回复了 aa 的评论         踩      回复

大佬


你确定删除吗?
1024
x

© 2018-2024 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息