解题思路:
找到小数点位置并移除小数点
移除前导0
将字符串转换为整数数组
通过n次乘以2来实现乘以2^n
计算新的小数点位置
进行四舍五入操作
截断小数部分,只保留整数部分
输出结果
参考代码:
#include <bits/stdc++.h> using namespace std; void multiplyBy2ToN(string s, int n) { // 找到小数点的位置 int dotPos = s.find('.'); // 计算小数部分的长度 int decimalPlaces = s.length() - dotPos - 1; // 移除小数点 s.erase(dotPos, 1); // 将字符串转换为整数数组 vector<int> digits; for (char c : s) { //例如"123.345" -> 123345 注意digits中 低位在右边高位在左边 digits.push_back(c - '0'); } // 以字符串的形式实现计算乘以2^n for (int i = 0; i < n; i++) {//n次循环,每次乘2 int carry = 0;//记录进位值 //低位在右边高位在左边 for (int j = digits.size() - 1; j >= 0; j--) { int product = digits[j] * 2 + carry;//当前位的计算加上低位的进位值 digits[j] = product % 10;//当前位的计算结果 carry = product / 10;//向高位的进位值 } if (carry > 0) { //如果最终还有进位值那么就直接是新的最高位(digits的左边) digits.insert(digits.begin(), carry); } } // 计算新的小数点位置 :根据乘法规则原来有几位小数结果就有几位 //故小数点的位置 = 数字长度 - 小数的长度 int newDotPos = digits.size() - (decimalPlaces ); // 如果新的小数点位置小于等于0,则在前面添加0 //结果是10^-k次方 插入前导0,123 -> 0.00123 if (newDotPos <= 0) { digits.insert(digits.begin(), -newDotPos + 1, 0); newDotPos = 1; } // 四舍五入 if (newDotPos < digits.size()) { if (digits[newDotPos] >= 5) { // 从newDotPos-1开始向左进位 int i = newDotPos - 1; while (i >= 0) { if (digits[i] < 9) { digits[i]++; break; } else { digits[i] = 0; i--; } } // 如果所有位都是9,就会一直进位导致i < 0,则在最前面添加1 if (i < 0) { digits.insert(digits.begin(), 1); newDotPos++;//小数点位置同步更新 } } } // 舍弃小数部分 if (newDotPos < digits.size()) { digits.resize(newDotPos); } for(int c : digits){ cout<<c; } } int main() { int n; string s; cin >> n >> s; multiplyBy2ToN(s,n); return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复