文章目录
- 前言
- 一、题目
- 二、代码及思路
- 总结
前言
这题好像是指定了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的。希望读者能从本文获得些许灵感。