您当前的位置: 首页 >  蓝桥杯

不牌不改

暂无认证

  • 0浏览

    0关注

    422博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

[蓝桥杯][算法提高VIP]实数相加

不牌不改 发布时间:2021-08-06 23:09:52 ,浏览量:0

题目

题目链接

题解

高精度加法。

这里是高精度的一些模板和基础讲解,如果这个都不会下面是没法看的

实数,我们分成整数部分和小数部分分别计算。

整数部分: (代码中先计算的小数部分,因为小数部分可能存在给整数部分的进位) 首先要做的就是提取出来整数部分; 根据小数部分的进位进行高精度加法即可; 下面代码我是先将两个数的整数部分翻转后保存在两个数组中,再进行的加法计算。 这部分比较基础不再赘述。

小数部分: 这部分是本题的难点所在。 小数部分的计算与整数部分还是有点区别的,小数部分要左对齐计算,且进位是向左侧进的。 我们先提取出两个数的小数部分,将其左对齐,再从两个数的小数部分较短者的小数部分的末尾位置开始进行向左进位的加法计算,这里我是将结果保存在一个数组中,这个数组的高索引位置保存的是靠近小数点的数相加的结果,低索引保存的是靠右的数相加的结果,即若要从终端按要求显示则需要逆序输出这个数组,这样做的目的还是为了方便保存最左侧的数相加之后的进位。

通过一个图来理解: 在这里插入图片描述 还剩部分小数位是不用计算的,直接输出就好了。

小数点的输出: 只要有一个数有小数点,那么结果就有小数点。

细节看代码吧,代码注释很详细,直接通过网页看不是很方便,建议复制下来之后调整排版和缩进观看。

代码
#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             
关注
打赏
1662186765
查看更多评论
0.0406s