C++每日一练:难题-大数加法

文章介绍了如何使用C++进行大整数加法的实现,通过将数字转化为字符串处理,避免超出范围的问题。主要步骤包括将输入转换为字符串、处理不同长度的数字、逐位相加并处理进位,最后组合结果。代码中涉及字符串长度比较、substr方法和进位逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

这题好像是指定了C++,那就用C++来做嘛,确实在C/C++中一不小心就超出范围了,说实在的,C++这个语言有时候真的很让人无语。很显然这是要用字符串来计算了。这题坑比较多,笔者这也是折腾了好一会儿才搞定。
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目

题目描述:
大数一直是一个c语言的一个难题。 现在我们需要你手动模拟出大数加法过程。 请你给出两个大整数加法结果。

输入描述:
第一行输入整数n,第二行输入整数m。 (1<=number<=1e100)

输出描述: 输出两数加和。

二、代码及思路

代码如下(示例):

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
string solution(string n, string m){   //这里要改成字符串参数
    string result;     //这里要改成字符串
    // TODO:
    string sn = n;          //to_string(n);
    string sm = m;          //to_string(m);
    if (sn.length() > sm.length()){
        string tmp = sn;
        sn = sm, sm = tmp;
    }
    int len_sn = sn.length();
    int len_sm = sm.length();
    int forward = 0;       //进位
    string sum;           //结果
    string more = sm.substr(0, len_sm-len_sn); 
    while (len_sn > 0){
        int num_m = sm[len_sm-1] - '0';
        int num_n = sn[len_sn-1] - '0';
        int val = num_m + num_n + forward;
        forward = val/10;
        sum = to_string(val%10) + sum;
        len_sn--, len_sm--;
    }
    int len_more = more.length();
    while (len_more > 0){
        int _m = more[len_more-1] - '0';
        int val = _m + forward;
        forward = val/10;
        sum = to_string(val%10) + sum;
        len_more--;
    }
    if (forward) sum = '1' + sum;
    result = sum;
    return result;
}

int main() {
    string n;  //这里要改成字符串
    string m;  //这里要改成字符串
    std::cin>>n;
    std::cin>>m;
    string result = solution(n, m);  //这里要改成字符串
    std::cout<<result<<std::endl;

    return 0;

看上去代码有点多,其实思路挺简单的。这是写复杂了,可以优化的。笔者这里偷懒了,就这样吧,反正结果正确就好。

首先把输入的n、m改成字符串输入,不然只能过40%,这题中已有代码就是个大坑!同样,它们作为参数传递也得改类型,以及solution函数的返回类型都要改。笔者是后来实在找不到毛病才想到的,所以代码中有sn = n这么傻的写法。因为我原来没改,是用来把long long int转成string的。后来想想输入要求1e100…

这里还存在一个长度问题,因为我们不知道哪个字符更长,后面循环时就有可能越界,也为了方便计算出more部分。所以代码一开始就固定了m比n长或相等。

然后又定义了more这个用来表示m比n长出的从0到超过的位数。计算完相同长度后再在前面加上more和进位的计算。

然后就简单了,把字符串的最后一个字符加或减0,它就强制转换成int了,把n和m从后到前的每一位相加,forward是用来存进位的,forward初始值是0,每次都要加上进位。后面的第二个while的逻辑和这里相加是一样的,第二个while是计算上述more部分的,只有进位的计算。

在计算完more部分后,还是有可能有进位的!这里就用了if直接写上一个1,二个数相加,进位最大就是1。


总结

这道题目挺有意思的,也存在不少坑,可能题目是故意这么出的。比较考验阅读理解能力,计算结果如果太大是没法再转换成int的。希望读者能从本文获得些许灵感。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无证的攻城狮

如本文对您有用,大爷给打个赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值