题目
题目链接
题解高精度加法。
这里是高精度的一些模板和基础讲解,如果这个都不会下面是没法看的
实数,我们分成整数部分和小数部分分别计算。
整数部分: (代码中先计算的小数部分,因为小数部分可能存在给整数部分的进位) 首先要做的就是提取出来整数部分; 根据小数部分的进位进行高精度加法即可; 下面代码我是先将两个数的整数部分翻转后保存在两个数组中,再进行的加法计算。 这部分比较基础不再赘述。
小数部分: 这部分是本题的难点所在。 小数部分的计算与整数部分还是有点区别的,小数部分要左对齐计算,且进位是向左侧进的。 我们先提取出两个数的小数部分,将其左对齐,再从两个数的小数部分较短者的小数部分的末尾位置开始进行向左进位的加法计算,这里我是将结果保存在一个数组中,这个数组的高索引位置保存的是靠近小数点的数相加的结果,低索引保存的是靠右的数相加的结果,即若要从终端按要求显示则需要逆序输出这个数组,这样做的目的还是为了方便保存最左侧的数相加之后的进位。
通过一个图来理解: 还剩部分小数位是不用计算的,直接输出就好了。
小数点的输出: 只要有一个数有小数点,那么结果就有小数点。
细节看代码吧,代码注释很详细,直接通过网页看不是很方便,建议复制下来之后调整排版和缩进观看。
代码#include
using namespace std;
const int N = 110;
string s1, s2;
int a[N], b[N], sign[N], iger[N];
int main()
{
cin>>s1>>s2;
int n1 = s1.size(), n2 = s2.size(); // n1、n2分别为两个数的长度(含小数点)
int p1 = n1, p2 = n2; // 小数点位置初始化为字符串结尾的后一位,即截止符的索引
for(int i = 0;i 0;i --) { // 小数位的加法计算,要从靠后的小数位算起,一直算到0.1分位;调整好顺序后做法与高精度加法没区别;i表示小数点后的第几位,因为是从后向前,所以我们要从m开始递减
int x1 = i+p1, x2 = i+p2; // x1、x2分别代表第一个数和第二个数小数点后的第i位在此数的字符串中的索引
sign[m-i] += (s1[x1]-'0') + (s2[x2]-'0'); // 下面就是加法了;sign[0]保存的是靠后的小数位,sign[m]保存的是0.1分位
sign[m-i+1] = sign[m-i] /10;
sign[m-i] %= 10;
}
for(int i = 0;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?