试题 D: R 格式
题目描述
小蓝最近在研究一种浮点数的表示方法:R 格式。对于一个大于 0 的浮点
数 d,可以用 R 格式的整数来表示。给定一个转换参数 n,将浮点数转换为 R
格式整数的做法是:
1. 将浮点数乘以 $2^n$;
2. 四舍五入到最接近的整数。
输入格式
一行输入一个整数 n 和一个浮点数 d,分别表示转换参数,和待转换的浮点数。
输出格式
输出一行表示答案:d 用 R 格式表示出来的值。
样例输入1
2 3.14
样例输出1
13
样例输入2
2024
样例输出2
150
样例说明
$3.14 × 2^2 = 12.56$,四舍五入后为 13。
评测用例规模与约定
对于 50% 的评测用例:1 ≤ n ≤ 10,1 ≤ 将 d 视为字符串时的长度 ≤ 15。
对于 100% 的评测用例:1 ≤ n ≤ 1000,1 ≤ 将 d 视为字符串时的长度 ≤ 1024;保证 d 是小数,即包含小数点。
直接使用高精度乘法做,要注意小数点的位置。
代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
using namespace std;
deque<int> mul (deque<int>& A, int b)
{
deque<int> C;
int t = 0;
// 高精度乘法核心代码
for(int i = 0; i < A.size() || t; i ++)
{
if(i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
// 避免前导0, 比如 0*123
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main()
{
string a;
int b;
deque<int> A;
// 数据输入
cin >> b >> a;
int mark;
for(int i = a.size() - 1; i >= 0; i --)
{
// 标记小数点
if(a[i] == '.')
{
mark = a.size() - 1 - i;
continue;
}
A.push_back(a[i] - '0');
}
for(int i = 0; i < b; i ++) A = mul(A, 2);
while(mark --)
{
int tmp = A.front();
A.pop_front();
if(!mark && tmp >= 5)
A.front() = A.front() + 1;
}
// 打印输出
for(int i = A.size() - 1; i >= 0; i --)
printf("%d", A[i]);
return 0;
}