题目描述
小蓝最近在研究一种浮点数的表示方法:R格式。
对于一个大于 0 的浮点数 d ,可以用 R 格式的整数来表示。
给定一个转换参数 n,将浮点数转换为 R 格式整数的做法是:
- 将浮点数乘以 2^n;
- 四舍五入到最近的整数。
样例
2 3.14
算法
高精度乘法
本题理应使用两个大整数相乘,但是基于一个因子具有规律,即可以使用while循环来一步一步乘,不需要先计算出2^n。这样做既防止了乘数越界,也避免了两个大整数的相乘。
c++
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<int> res;
void mul(vector<int> &A, int B)
{
int temp = 0;
for(int i = 0; i < A.size(); i++)
{
temp += A[i] * B;
A[i] = temp % 10;
temp /= 10;
}
while(temp)
{
A.push_back(temp % 10);
temp /= 10;
}
}
void add(vector<int> &res, int dot)
{
int temp = (res[dot - 1] + 5) / 10;
for(int i = dot; i < res.size(); i++)
{
temp += res[i];
res[i] = temp % 10;
temp /= 10;
}
while(temp)
{
res.push_back(temp % 10);
temp /= 10;
}
}
int main()
{
string s;
int n, dot;
cin >> n >> s;
for(int i = s.size() - 1; i >= 0; i--)
{
if(s[i] != '.') res.push_back(s[i] - '0');
else dot = s.size() - i - 1;
}
while(n--) mul(res, 2);
add(res, dot);
for(int i = res.size() - 1; i >= dot; i--) cout << res[i];
return 0;
}