审题:
由于该题的数据值非常大,所以我们需要使用高精度计算法,简单来说就是先把数据通过字符串存储,然后转换到int型数组,对数据每一位分别进行乘法运算,然后循环进位
思路:
(1)数据录入与预处理:
1.反转字符串
2.找到并删除小数点
3.将字符每一位对应转换到int数组中
(2)乘法运算,进行n次乘法函数运算
乘法函数
1.对于每一位都乘二
2.循环进位
3.检查最高位是否有进位,有进位就让len++
(3)判断是否需要四舍五入
需要就还要进行进位以及最高位判断
(4)逆序输出
解题:
(1)数据录入与预处理:
注意这里d字符串中字符是从0下标开始存储,而a是从1开始存储的。
(2)乘法运算,进行n次乘法函数运算
这里就是相当于模拟我们日常手算的过程,之所以叫高精度计算,是因为我们可以对每一位都进行精准运算。而库自带的运算法则可能会因为该题的浮点型数精度过高而存不下丢失精度。
疑问一:为什么要反转字符串?
因为这样我们在进位的时候就是往下标大的方向进位,不会出现访问-1下标的情况
疑问二:为什么要删掉‘ . ’?
因为我们需要进行数字运算,如果中间夹着一个小数点会很麻烦
(3)判断是否需要四舍五入
疑问:为什么p的位置就是第一个小数的位置?
由于字符串d的下标是从0开始的,那么我们的小数点下标就是2,把2给到p,所以p==2
而int数组是从1开始的,所以第一个小数3就是下标为2,也就是p的值
故,a[p]就代表第一个小数
(4)逆序输出
因为是逆序,所以从len开始,又因为p位置是小数位置,所以我们不访问到p
链接:[蓝桥杯 2024 省 B] R 格式 - 洛谷