原题链接:蓝桥杯基础练习VIP-高精度加法
解题思路:
通过题目描述我们可以知道,用普通的加法是解决不了的,即使采用double也是不可取的。这题是属于高精度加法,高精度常用的算法有加法、减法、乘法、除法。
例如,有两个字符串,str1="123456789",str2="123456",用整型数组num1字符串str1的数字,用num2存储读字符串str2。如下所示。
然后将数组num2的元素加到数组num1,如下图所示。
遍历数组num1,如果num1中的某个元素num[i]大于10,就进入如下操作,num[i]减10,num[i+1]加1。
最后反向输出数组num1即可。
参考代码:
#include <iostream> #include <string> #include <cstring> #define maxn 105 typedef unsigned long ul; using namespace std; int num1[maxn],num2[maxn]; ul add(string str1,string str2){ ul size1 = str1.size(),size2 = str2.size(); for(ul i = 1; i <= size1; i ++){ num1[i] = str1[size1 - i] - 48; } for(ul i = 1; i <= size2; i ++){ num2[i] = str2[size2 - i] - 48; } for(int i = 1; i <= size1; i ++){ num1[i] += num2[i]; } for(int i = 1; i <= size1; i ++){ if(num1[i] >= 10){ num1[i+1] += 1; num1[i] -= 10; } } if(num1[size1+1] > 0){ size1 ++ ; } return size1; } int main(){ string str1,str2; cin >> str1; cin >> str2; ul len; memset(num1,0,sizeof(num1)); memset(num2,0,sizeof(num2)); if(str1.size() >= str2.size()){ len = add(str1,str2); }else{ len = add(str2,str1); } for(int i = 1; i <= len; i ++){ cout << num1[len - i + 1]; } cout << endl; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复